Smalltalkの予約語は
- nil
- 未定義オブジェクト(変数のデフォルト値)
- true
- ブール値
- false
- ブール値
- self
- 自分自身のオブジェクト
- super
- スーパースラスの文脈で評価される自分自身のオブジェクト
- thisContext
- 現在のメソッドの実行時スタック
以上の6つ。
最後のthisContextって何?って感じであまり馴染みがないのがthisContextだ。
こいつは文脈というオブジェクトを保持している。
具体的には、どういう順でメソッドが呼ばれるに至ったか、
そのメソッド内での現在の状態はどうなっているかといったことを保持している。
haltで止めた状態からthisContextをインスペクトするのと、メソッド内で
thisContext inspectとやってインスペクタを開くのでは結果が異なるという
一見理解しがたいことをやってくれる。
いまいち使いどころがわからなそうだが、実際はものすごい機能を持っている。
適当なクラスに以下のメソッドを定義して、aSenderをDo it してみる。
aSender
| foo |
foo := 'efgh'.
self evaluateFoo: thisContext
evaluateFoo: aContext
|val|
val := (Compiler new
evaluate: '''abcd'',foo'
in: aContext
receiver: aContext receiver
notifying: nil
ifFail: [#fail]).
Transcript cr; show: val
結果はどうなったか?
' ' 'abcd' ',foo'が評価されて、abcdefghが出力されたはずだ。
渡したのはthisContextだし、fooは一時変数だが、それでもevaluateFoo:の中では
fooという異なるメソッドの変数を理解できたということだ。
これを利用すると、コーディング部位を<%...%>みたいに囲むことで、PHPやASPや
JSPやeRubyのように
文字列の中にコードを埋め込み、しかもその文字列の中に一時変数まで
埋め込むというくらいは自分で実装できてしまう。
(ただし、それをうまく評価するにはそれなりにパースが大変。
あと、ウェブ利用ならWebToolKitなどすでにライブラリができている。)
ファイルに記録したSQLを読み込んで、変数の状態に合わせて動的に組み替えるといったことも
難なくやってのける。
最終更新:2011年03月23日 16:07