池田優一
eclip****@cspc*****
2005年 11月 25日 (金) 12:02:16 JST
池田です。 今日は夜勤なのでこんな時間にメールします。 > | ★不都合が見つからなければ良いと思います。 > | ただ、オブジェクトをオーバーライドする場合には不自然に感じるかもしれませ > | んね。下のフィルタと組み合わせればいけるかな。 > > ■僕も最初まずいかなあ思ったのですが、挙動部が両方あるような > オブジェクトを積極的に結合するような場面が思い浮かばなかったんだよね(^^; > 昔の議論の中でも、これ!っていうターゲットあったっけ? > ★普通のOOPLのオブジェクトには挙動部がないので、いい例というのは難しいん ですが、挙動部を特殊なメソッドと捕らえて利用してしまうとまずいってことで す。まちゃんと説明すればいいだけですね。 > 個人的には、以前よりもっと「作れる感」が増えて、 > 魅力的なおもちゃになったみたいで嬉しいw > > 結合則をしっかりしていてかつシンプルなものにすると、 > かなり強烈な「もの」感が出てくるような気がします。 > 頭の中にオブジェクトが図形化されてイメージできてしまうぐらいに。 > (僕はすでにそうなりかけてるのですがw こいつはエキサイティングです) ★ほぉ。S式を見ると脳内でCONSセルに変換されちゃう感じ?w mieのモデル表記も決めておくといいかもとか思ったり。 > | ★表記についてはわかりにくいような・・・w > | 前知識なしで読み取れば同じ空オブジェクトになりそうだし。 > | まぁ記号不足なので難しいですが。要検討。 > > ■記号をつけるのも考えたのですが、前知識なしで混乱、というよりむしろ、 > 以前のオブジェクトの定義(という既存知識)に対しての混乱でないですか? > > 最初からそういう風な定義だ、とした場合にそれほど > 混乱を起こす元になるかなあ、という気はしますが、詳しくは四つ下の■で。 ★例えば、 { |0| } と {|0|} は同じオブジェクトですよね? でも { | | } と {| |} は異なるフィルタであると。 あと {||0} は普通のオブジェクト(全透過)ですが、 {|| } は挙動部しか透過させないんですよね。 この辺、意味的に大きな違いが、表記的には小さな違いになってしまっているの がわかりにくいのではないかと。 > | > { A | x, y | x + y } <+ { || } > | > => { A | | x + y } > | > > | > となり、フィルタがかかったことで、要素部が通れなくなり、重ねたときに上から見えなくなりました。 > | > | ★削ぐわけではなくて隠すんですよね。Rubyのundefと似てます。 > | フィルタと呼ぶとちょっと語弊があるかもしれない。 > | マスクとか、カバーとか、シールドとか? > > ■あんまりundefという気はしないかな。内部名や挙動部にも使えるわけで。 > 要素部の一部に対してできればそうかもしれないけど、 > undefとかの対象はあくまでmieでいう束縛だから、もっと限定的な感じがする。 > > あと名称だけど、シールドだと重ねられる感じはしないなかなあ。 > あと、通す部分と通さない部分があるっていうのを言いたいので・・・。 > イメージ的にどうもマスクもカバーも「厚い」気がしてしょうがないですw > (あとマスクはビットマスクのイメージも強くて、焼き付ける感じもあるなあ) > フィルタは個人的に「薄い」感じがしたのでそういう名称にしてみました。 > > 図形的・機能的には「ゲート」が一番ぴったりだとは思っているのですが、いかんせん「重い」のですw > まあ、とりあえず名称は保留ですねえ。イメージとしては○○をさしこむとかはさむっていった感じ。 ★Rubyのundefは似てるって言っただけでundefと呼ぼう!とかはないですw むしろRubyのundefも名称変えた方が良いと思ってるくらいです。 個人的にはマスクが一番しっくりくるなぁ。フィルタはfilter関数と被るし。 > > | > これを使うことで、前回のメールでいった「強い」オブジェクトを作ることができます。すなわち、 > | > > | > .a = { | |} <+ { aを取り出す処理 } > | > { A | a = 1 | do-something } .a > | > => { A | a = 1 | do-something } <+ ({ | |} <+ { aを取り出す処理 }) ! > | > => { A | a = 1 | aを取り出す処理 } ! > | > => 1 > | > > | > となります。これは対象オブジェクトとaを取り出す処理を持つオブジェクトの > | > 間にフィルタが入ることで、do-somethingを見えなくしたからです。 > | > | ★うん、やっぱりこれだとわかりにくいから目立つ記号を入れたい気分。 > | フィルタていう概念はオブジェクトに新しい性質が加わったということになりま > | すよね。普通のオブジェクトは{ | | }というフィルタを性質として持っている > | と。んでフィルタはメタ結合時に必ず左側が引き継がれるということでしょう > | か。 > > ■左?右の間違い?(すまん、ちょっと質問の意図が分からんです^^;) > 「フィルタは」とかではなくメタ結合自体をすべて「上」優先にしたということです。 > メタ結合のルールをシンプルにしようというのがそもそもの発端なので。 > > 「メタ結合というのは重ねるイメージですよ」といって説明するには > 今までのルールはちょっと複雑になりすぎているような気がしてました。 > なので、今回のリファクタリングで狙ったのはイメージと現実の差を埋める事です。 ★私のフィルタというものの理解が間違っているのかもしれません。 まず、 1. フィルタはオブジェクトの性質である 2. フィルタは新しいオブジェクトである 1だと思ってますが違いますか。 ここが違うとこの後のも全然意識合ってません(汗 1だとすると、イメージ的には {内部名 | 要素部 | 挙動部 | フィルタ} となります。 んでフィルタは3bitのマスクです。 ビットがONになっている場所は、 このオブジェクト(左)に別のオブジェクト(右)がメタ結合された場合、 新しいオブジェクトではこのオブジェクトの定義をそのまま使うことになります。 新しいオブジェクトのフィルタはこのオブジェクト(左)のフィルタと同じビット パターンになります。 この例で、 { A | a = 1 | do-something } <+ ({ | |} <+ { aを取り出す処理 }) ! フィルタが右を引き継ぐようにしてしまうと、 { | |} <+ { aを取り出す処理 } この時点で全透過になってしまいますよね。 右の{aを取り出す処理}オブジェクトは全透過なので。 だからフィルタは左が引き継がれる、と解釈しました。 > | 表記の一案としては、 > | { | | } → [___] > | {||} → [///] > | とか。見た目重視で。 > > ■うーん、正直なところ、これ以上やたらに記号増やしたくないなあ、という感じです(^^; > (覚えるのも説明するのも大変そうな気がするので・・・) > > 表記に関しては、普通の{ | | } とうまく折り合いのつけられる表現でないとまずいですね。 > { | | }を普通の空オブジェクトとすれば通過ですから、もう片方の表現は非通過でなければなりません。 ★オブジェクトリテラルにフィルタ指定を直書きできるようにするのであればそ う思うんですけどね。 {内部名 | 要素部 | 挙動部 | フィルタ} そのまんまやると、 {@name | x, y | x * y | 010} とか、まぁないだろうけどw 普通のオブジェクトと折り合い付けるならこういった感じになるように 思いますがどうでしょう。