ノート:Smalltalk

ページのコンテンツが他言語でサポートされていません。

「メッセージ送信をダイレクトに記述する表記」とは何を意味するのですか? 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 の実行文部分すらオブジェクトか、そうでないかの違いです。 --通りすがり

Smalltalk については全く知らず,詳しいことがわからないのでどちらかというと読者の所感というつもりで読んでいただきたいのですが,前半部分については Smalltalk が環境であることというよりは言語デザインの話であるように見え(Haskell が環境という言い方は聞いたことがありませんが,その(純粋)関数型言語としての性質から,手続き型言語に慣れていると初めはとっつき難い,ということは同様にいえるのではないかとおもいます),「Smalltalk 言語は Smalltalk 環境から見ると、その扱いはいわば bash などのシェルに近い」以降の部分は Smalltalk に限らず一般の対話環境を持つ言語(python しかり,ruby しかり)について言えることのように思えます

節全体としてピントがずれているか,あるいは本来の意図が伝わりにくい書き方になっているか,なのではないかと感じます.--あるうぃんす会話2014年1月10日 (金) 11:51 (UTC)[返信]

そうですね。ぼやけてるのでなんとかしたいですね。--Anonymouse jp会話2014年1月18日 (土) 11:33 (UTC)[返信]