言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

あたらしい EToys のためのメソッド、関数合成、パイプ

例えば、Squeak

(object method1: arg1) method2: arg2

をこういう風に書けるのはどうでしょう?

object >>> {#method1:. arg1} >>> {#method2:. arg2}

あまり嬉しくない?カスケードとの違いは、カスケードが常にレシーバに対するメソッド呼び出しになるのに比べ、返り値が次のレシーバになる事です。例えばこういう風に使う事を想定しています。

"hello.mp3" >>> {#asFileName} >>> {#read} >>> {#asSound} >>> {#velocity: 60} >>> {#play}
(hello.mp3 というファイルを読み込んで音声に変換して音量 60 で再生するスクリプトのつもり)

特徴は、結合法則が成り立つように作ればタイルスクリプトとの相性が非常に良くなるという事です。どこで切っても意味が通り、しかもネストが不要です。>>> の実装はこんな感じです。

'From TinLizzie1.0 of 14 January 2006 [latest update: #864] on 14 July 2006 at 2:19:19 pm'!

!Object methodsFor: 'evaluating' stamp: 'ta 7/14/2006 14:14'!
>>> messages 
	messages isEmpty
		ifTrue: [^ self].
	messages first isSymbol
		ifTrue: [^ self perform: messages first withArguments: messages allButFirst].
	^ self >>> messages first >>> messages allButFirst! !


!Array methodsFor: 'evaluating' stamp: 'ta 7/14/2006 14:17'!
>>> anArray
	^ Array with: self with: anArray! !

このように結合法則も成り立ちます。(注 これはウソでした。あとでどうするべきか考えます)

1 >>> {#+. 2} >>> {#*. 3}
1 >>> ({#+. 2} >>> {#*. 3})

本当はパイプ記号を使いたかったのですが、すでに使われていたので止めました。考え方としてはパイプと同じだと思います。