予約語と幻のシックスマン

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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。