ノート:Smalltalk
出典: フリー百科事典『ウィキペディア(Wikipedia)』
「メッセージ送信をダイレクトに記述する表記」とは何を意味するのですか? Smalltalkのあの表記が「特殊」(珍しい)であるのは恐らく疑問の余地が無いですが、 「ダイレクト」という言葉が出る理由がわかりません。
C言語のifとSmalltalkのif(系のメッセージ)との間には決定的な違いがありますが、 C言語の引数括弧とSmalltalkの引数の書き方の違いは パーサーのちょっとした振る舞いの違いでしかないはず。いわば構文糖。 「ダイレクト」という言葉が入り込むような種類の相違は、無いのではないですか? --匿名
メッセージメタファ(比喩)をダイレクトに表現できる文法と捕らえるべきでしょうか。
if (a < 4){ printf( "4より小さい" ); }
を読み上げると、「もし、aが4より小さければ、"4より小さい" と printfする」 ですが、
a < 4 ifTrue: [ Transcript show: '4より小さい' ]
は、
1. aに 「コレあなたより小さい?」(コレは"4"オブジェクト)とメッセージを送って、
2. 返ってきたオブジェクト(true か false オブジェクト)に、「あなたは真だったらコレをして」 (コレは [Transcript show:'4より小さい']というオブジェクト)メッセージを送る。
―と、読み上げます。 このように、Algol系言語が「手続きの記述」をするための文法を持っていることに比較して、 これをもって「メッセージ送信をダイレクトに記述する表記」と言っているのでは ないでしょうか。
また、構文の違いをシンタックスシュガーではないかという疑問については、
Cのif-else文はフロー制御構文ですが、 Smalltalkの ifTrue:ifFalse: メッセージはメッセージ式であり、 シンタックスシュガーというレベルの違いではありません。 (実行モデルが大きく違います) これらは関数リテラルが記述出来る言語特有の (むしろlispにちかい)振る舞いになります。
解りやすく説明すると、SmalltalkのifTrue:メッセージに渡される 引数としてのコードは、動的に変更することが可能です。
int HogeClass::doSomething( ) { if (this.isSleeping != TRUE){ do(); } }
のような、オブジェクトが自身がスリープしていないときに "何か" するようなソースコードがある場合、 これを改造して「何か(= do()の処理)」を受け渡すのは大変ですが、Smalltalkの場合ごく簡単に行えます。
doSomething:do self isSleeping not ifTrue: do.
つまりCでいう if の実行文部分すらオブジェクトか、そうでないかの違いです。 --通りすがり