JavaプログラマのためのSmalltalk構文のまとめ
#改訂 06/07/2001

こちらもごらん下さい
http://www.chimu.com/publications/JavaSmalltalkSyntax.html

http://www.mucow.com/squeak-qref.html


「Smalltalkのすすめ」(梅澤真史 今野睦他訳)をもとに、一部「ウィンストンのSmalltalk」(飯塚富雄訳)、
Squeak(Mark Guzdial 2001/1月発行) )を使ってまとめました。
JavaプログラマにSmalltalkコードの意味をつかんで貰うためのまとめですので、不正確な部分があります。
ご承知おき下さい。

必要な場合のみJavaの例を参考に書きます。

定数
数値
 整数  1
 実数  1.23
 n進数 16進数 16rFF8C 8進数 8r25
文字
 $をつける $a
文字列
 ’で囲む ’hello’
シンボル
 #をつける :クラス名、クラス変数、グローバル変数など
配列
 #で始まり、スペースを空け()で囲む #(1 100 1000) #(1 ’2’ $3)
真偽値
 True Falseクラスの唯一のインスタンス true false
ブロック式
 [ 式 ] [:ブロック変数 | 式 ]のように記述 [:var | var inspect ]
ブロック変数(:var) はインデックス変数として使われ、呼び出し元から順次渡される。
変数 
 
代入 var := 'abc' ( := または 左向き矢印 <- )
変数には型宣言は無い
オブジェクトはクラス名に  a 、an をつけるのが一般的。 aClass, anObjectA

一時変数 メソッドやブロック式の最初に定義し、その中だけで有効。 |線で囲む。  |temporary var|
インスタンス変数 :小文字で始まる
クラス変数  :大文字で始まる
クラスインスタンス変数 メタクラスに対するインスタンスとしてのクラスオブジェクトがインスタンス変数として持ち、各クラスが保持する。
ブール変数
グローバル変数 :大文字で始まる

メッセージ式 全てのSmalltalkプログラムは(代入を除く)はオブジェクトにメッセージを送るという以下の形式をとる。
anObject(レシーバ) message(セレクタおよび引数).
’.’は終了を示す。(Javaの ’;’)

単項メッセージ : 引数を伴わないメッセージ式。レシーバ セレクタの順となる。
 例 1 negated       (オブジェクト 1 に negated のメッセージを送る)
    'hello text' asFile  (オブジェクト 'hello text' に asFile のメッセージを送る

二項メッセージ : +、-、*、/などの演算子を使うメッセージ式。レシーバ メッセージセレクタ 引数オブジェクト となる。
 例 1 + 2  (オブジェクト 1 にメッセージ + を引数オブジェクト2 と共に送る)
// は 整数化除算

キーワードメッセージ式 : コロン(:)で終了するセレクタに続いて引数を指定。
:は複数可なので、 幾つでも続くことになる。
 例 Transcript show: 'hello'

     Transcript(出力画面)に 'hello' を引数として、show: 'hello' メッセージを送る。

      anArray at:(3)put:(4)

     anArray に at:(3)put: (4) メッセージを送る。 at 3 の内容を put 4。

メッセージの
優先順位
単項メッセージ > 二項メッセージ > キーワードメッセージ式 となる。 これ以外は左から右へ評価する。

例: anArray at:1+3 put: 4 + 3 negated は以下と同意になります
  anArray at:(1+3) put:(4 + (3 negated))
  anArray at: (4) put:(1)

加減乗除の優先は無し。左から順番に実行。
例: 1+2*3  結果は9

メッセージのカスケード メッセージ式を続けて書くと、3つ目以降のオブジェクトには前のメッセージ式の返り値(オブジェクト)が送られる
例: 1 negated printString
   1にnegated メッセージを送る。返って来た −1(数値)に文字列に変換するメッセージ printString を送る

カスケード(連結)の場合は、直前に実行されたメッセージ式のレシーバへ再び別のメッセージを送る。’;’に続いてメッセージセレクタを記述する。
例: 1 negated;printString
   1にnegated メッセージを送る。返ってくる -1 ではなく、再度、1に文字列に変換するメッセージを送る。

制御構造
とブロック式
制御構造は文法では無く、クラスライブラリとして定義してある。以下の様な記述になる

10 > 0
 ifTrue: [Transcript show : 'Bigger!'].
 ifFalse: [Transcript show : 'Smaller'].

 10>0 が もしTrue なら (Transcript に show: 'Bigger' を送る)
 10>0 が もしFalse なら (Transcript に show: 'Smaller' を送る)

 # java if (10 > 0) then {System.out.print("Biggger");} else {}
------------------
1 to: 4 do: [:anInteger | Transcript show: anInteger printString]

オブジェクト 1 に対して、 to: 4 do: [Transcrpt に (anInteger に printString を送り、返ってきたオブジェクトを)
show: で送る。これを 次に渡される 2,3,4 でも繰り返す] 
 # java for (int i = 1;  i <= 4;  i++) {出力};

[n ~= 0] whileTrue: [n := n -1. result := 2 * result].
 # java while (n != 0) {n--; result *= 2;}

以下は同じ制御をします
a := 1.

[a < 10] whileTrue:

  [ a := a + 1.

    Transcript show: '9times';cr]



1 to:10 do:[:index | Transcript show: (index printString), 'times';cr].

 Transcrpt に show: (index printString) を送り、返ってきたオブジェクトに 'times' を送り、

 再度、Transcrpt に cr を送る(:cr 改行)。

クラス <クラス定義のテンプレート>

Object subclass: #NameOfClass
instanceVariableNames: 'instVarName1 instVarName2' インスタンス変数
classVariableNames: 'ClassVarName1 ClassVarName2' クラス変数
poolDictionaries: ''
category: 'Balloon3D-Plugins' カテゴリー

 # java
 package x.Balloon3D-Plugins
  class NameOfClass extends Object {
   private static int ClassVarName1;
   private int instVarName1;
   private String instName2;
 }

全てのメソッドは Public (#人の環境には手を出さないのがマナー!)
全てのインスタンス変数は Private
クラス、メソッドはカテゴリ、プロトコルでintention(意図)などにより分類される。

メソッド <メソッド定義のテンプレート>

message selector and argument names 
"comment stating purpose of message" 

| temporary variable names | 一時変数
statements 

メソッド名称(セレクタ)と引数名
”コメント”
|使用する一時変数のリスト|
ステートメント

-----------
返り値 (キャラットまたは上向き矢印)
^var.
 デフォルトでselfを返す

#java return var;
  デフォルト return this;