[SML 7316] Re: ブロック生成のメタプログラミング

NISHIHARA Satoshi nishis @ zephyr.dti.ne.jp
2007年 9月 12日 (水) 02:12:52 JST


on 07.9.12 1:30 AM, Masato Sumi wrote:
> たとえば Symbol に次のような振る舞いの #value: 、#value:value: を
> 定義しても、同じようなことは可能だと思うのです。
> 
> Symbol >> value: anObject
>     ^anObject perform: self
> 
> Symbol >> value: anObject value: argument
>     ^anObject perform: self with: argument
> 
> (1 to: 10) select: #even    "=> #(2 4 6 8 10) "
> #(a b c) with: #(1 2 3) collect: #->   "=>  {#a->1 . #b->2 . #c->3} "
> (1 to: 10) inject: 0 into: #+   "=> 55 "

これは
http://blog.3plus4.org/2007/03/27/selectors-as-blocks/
で Alan Knight さんが付けてたコメントと同じですね.

> 自分なりに考えてみたところでは、実際にブロックを生成することで、通常、
> ブロックを引数に取るメソッド呼び出しのシグネチャのようなものを変えないため…、
> あるいは、シンボルがセレクタとしてまだ機能しないときの遅延処理のため…、
> といったものを思いつきましたが、他にもあれば教えていただければ幸いです。
> 
> なお、#asBlockFor: のほうは、ある種のカリー化なので、ブロックをアドホックに
> 生成する意義は大いにあると分かります。

すぐに思い付くのが,
((0 to: 9) select: [:each | #odd value: each]) fold: [:x :y | x perform:
#* with: y].
または
((0 to: 9) select: [:each | #odd value: each]) fold: [:x :y | #* value:
x value: y].
と書くところが
((0 to: 9) select: #odd asBlock) fold: #* asBlock.
で済むこと.ブロックを明示的に指定する必要がないこと.かな〜.

たぶんポイントは

on 07.9.6 10:12 AM, AOKI Atsushi wrote:
> asBlock / asBlockFor: のメッセージに応えられる他のオブジェク
> トの候補としては Message / MessageSend / BlockClosure などの
> オブジェクトたちがあげられると思います。

にあると思うんですが.シンボルだけが使えてもあんまご利益がないと言うか,
説得力に欠けるというか.

-- 
--------------------------------------------
西原聡士 (NISHIHARA Satoshi)
URL:    http://www.zephyr.dti.ne.jp/~nishis/
--------------------------------------------



SML メーリングリストの案内