Jumpei Arakawa
araka****@infoc*****
2005年 11月 24日 (木) 00:16:11 JST
荒川です。 結合則のリファクタリング案を示します。 骨子: 1. 要素部と挙動部の結合に関しての違いをほぼなくす 2. フィルタという概念を追加する (3. 結果的に抽出則はなくなる) 1. 要素部と挙動部の結合に関しての違いをほぼなくす 現在、結合に際して要素部と挙動部のルールが異なりますが、 挙動部の結合ルールを要素部のそれに合わせます。 つまり、後ろから結合するものが優先され、かつ追加するということです。 { A | x, y, z | x + y + z } <+ { B | a, b, c | a + b + c } => { B | x, y, z, a, b, c | x + y + z; a + b + c } 唯一の例外は、束縛に関しての穴埋めルールのようなものが存在しないことです。 また、以前あった内部名が共通の場合云々の話は特別扱いではなくて、 内部名が同じなら自然と同じように見えるというだけのことになります。 当然ですが、nil(空の状態)の挙動部を重ねたとしても影響はありません。 { A | x, y | x + y } <+ [ 1, 2 ] => { A | x = 1, y = 2 | x + y } これに関連して便利な識別子itを考えました(itという名称は仮称)。 itは、事前の評価結果を束縛結果としてもつ識別子です。したがって、 { do-something } <+ { print: it } => { do-something; print: it} 等で簡単に表示処理等を埋め込むことが可能になります。 (まあ、このこと自体は以前のルールでも可能でしたが) 2. フィルタという概念を追加する このフィルタという概念はメタ結合の最初からのイメージである 「重ねる」というものから自然に発想したものです。 (以下の表記はまだ仮のものです。問題があれば変えましょう) { | | } これは、内部名、要素部、挙動部を全て透過させるフィルタです。 { || } これは、内部名と挙動部は通しますが、要素部を通さないフィルタです。 { | |} これは、内部名と要素部は通しますが、挙動部は通さないフィルタです。 {| | } これは、要素部と挙動部は通しますが、内部名は通さないフィルタです。 {||} これは、内部名、要素部、挙動部のいずれも通さないフィルタです。 冗長なので全てを列挙はしませんが、要するにスペースのふさがった記述で「非透過」を示します。 例えば、 { A | x, y | x + y } <+ { || } => { A | | x + y } となり、フィルタがかかったことで、要素部が通れなくなり、重ねたときに上から見えなくなりました。 これを使うことで、前回のメールでいった「強い」オブジェクトを作ることができます。すなわち、 .a = { | |} <+ { aを取り出す処理 } { A | a = 1 | do-something } .a => { A | a = 1 | do-something } <+ ({ | |} <+ { aを取り出す処理 }) ! => { A | a = 1 | aを取り出す処理 } ! => 1 となります。これは対象オブジェクトとaを取り出す処理を持つオブジェクトの 間にフィルタが入ることで、do-somethingを見えなくしたからです。 強いオブジェクトというのは我ながらちょっと無理やりな気がしたのですが、 重ねるというイメージからいってフィルタがあるというのは個人的にしっくりきました。どうでしょう?