
出所
The Gang of Fourのメンバーの1人であるRalph Johnsonは、かつてSmalltalk-80言語の構文がハガキにどのように適合するかを示しました。 現在、Smalltalkの最初のバージョンのほぼ30年後、Smalltalkの最も急成長している方言はPharoであり、そのポストカードは後で分析します。
メソッド宣言
exampleWithNumber: x
メソッドは、 :
として宣言され、クラスのメンバーです。 複数のパラメーターを持つメソッドは次のように宣言されます
rangeFrom: start to: end
メソッド名はrangeFrom:to:
で、パラメーター名はstart
とend
です。
プラグマ宣言
<syntaxOn: #postcard>
プラグマは、メソッドに注釈を付けるために使用されます。 この注釈は、コンパイラまたは他のメソッドでメタデータとして使用できます。
コメント
コメントは引用符で示されます。 コメント内の引用符は二重引用符で示されます。
ローカル変数を宣言する
| y |
ローカル変数は、メソッド内の計算で使用されます。 Smalltalkは動的に型指定される言語であるため、変数の型宣言は必要ありません。
複数の変数が1つのリストで宣言されています。
| yx totalSum |
オブジェクトとメッセージ
true & false not & (nil isNil)
Smalltalkのすべてはオブジェクトであり、オブジェクトはメッセージを受信できます。 実行順序(つまり、メッセージの送信)は左から右ですが、パラメーターのないメッセージは主に優先度ルールに従って送信されるため、ここでの計算順序は次のようになります。
(true & (false not)) & (nil isNil)
Smalltalkには4つの優先ルールのみがあります。最初にメッセージが括弧で送信され、次に単項(受信者オブジェクト以外の追加パラメーターなし、たとえばfalse not
)、バイナリ(1つの追加パラメーター、たとえば1 + 2
)、いくつかのパラメーター(例: 15 between: 1 and: 2
)。 実行の優先順位は、単純なスキームで示されます。
大括弧 > 単項式 > バイナリー > 複数のパラメーターを持つメッセージ
これらの規則は数学演算にも適用されるため、式の結果
1 + 15 / 4
4
ます。 ところで、 nil
オブジェクトでもあり、メッセージを受信して応答できます。
条件付き実行とコードブロック
true & false not & (nil isNil) ifFalse: [ self perform: #add: with: x ].
条件付き実行は、 ifFalse
オブジェクトにifTrue
、 ifFalse
メッセージを送信することにより実装されます。 このメッセージの引数は、指定された条件が満たされた場合に実行される角括弧で示されたコードブロックです。
Smalltalkブロックは、匿名関数としても使用されます。
sum := [ :x :y | x+y ]. sum value: 10 value: 25.
自分にメッセージを送信する
self perform: #add: with: x
self
キーワードは、オブジェクト自体にメッセージを送信するときに、メソッドを含むオブジェクトへの参照として使用されます。 ここで、引数#add
およびx
含むperform:with:メッセージを送信します。 記号#
はリテラル文字列を示し、ここでメソッドの識別子として使用されます。
変数の割り当て
y := thisContext stack size + super size.
変数の割り当ては、演算子:=
によって示されます。 superキーワードは、スーパークラスオブジェクトを参照するために使用されます。
すべてのSmalltalkオブジェクトは、 Object
クラスまたはそのスーパークラスのいずれかから継承し、さらにスーパークラスまたはObject
クラスから継承します。
静的配列
byteArray := #[2 2r100 8r20 16rFF].
byteArray
は、クラスが宣言されたときに宣言されたクラスインスタンス変数です。 byteArray配列は、異なる数体系で記述された形式の整数で構成されます
<>r<>
静的配列のサイズは固定され、コンパイル時に設定されます。 配列のインデックスは1から始まります
byteArray at: 2
当初から、Smalltalkは言語であるだけでなく、独自の仮想マシンを備えた統合開発環境でもありました。Smalltalkクラスとメソッドは個別のテキストファイルに保存されず、仮想マシンイメージにすぐに保存され、開発環境インターフェイスを介して宣言されます。 たとえば、クラスCounter
クラスセクションで次のように宣言されます。
Object subclass: #Counter instanceVariableNames: 'count initialValue' classVariableNames: '' package: 'MyCounter'
そして、そのメソッドはCounter
クラスのmethodsセクションで宣言されています。
動的配列
{ -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) }
実行時に動的配列が作成されます。
配列にはさまざまなタイプのデータを含めることができます。配列の最初の要素は数値-42で、配列の2番目の要素はさまざまなタイプの要素を持つ配列です。
$a
文字「a」#a #'I''m'
リテラル文字列 "a"および "I'm"'a'
a'-文字列 "a"1.0 1.23e2
浮動小数点数3.14s2
スケール2の小数
サイクル
{ -42 . #($a #a #'I''m' 'a' 1.0 1.23e2 3.14s2 1) } do: [ :each | | var | var := Transcript show: each class name; show: each printString ].
Smalltalkのループは、この配列の各要素で実行されるブロックを持つメッセージを配列に送信することで実装されます。これは、機能的なアプローチに非常に似ています。 各反復で、配列の要素は、計算を実行するブロックに引数として渡されます。 この例のブロックでは、ローカル変数varが宣言されており、最後のshowメッセージをグローバルTranscript
オブジェクトに送信した結果が割り当てられています。
Smalltalkの興味深い機能は、メッセージをカスケードする機能です:式
Transcript show: 'A'; show: 'B'.
Transcript
コンソールウィンドウに行A
とB
順番に表示します。 これはコードと同等です
Transcript show: 'A'. Transcript show: 'B'.
ただし、Transcriptメッセージレシーバーオブジェクト名の繰り返しは避けます。 カスケードの結果は、最後のメッセージに対するオブジェクトの応答です。
メソッドからの戻り値
^ x < y
戻り値は^
示されます。 この場合、論理値-比較x < y
結果が返されます。