[SML 7547] Re: 第7回Smalltalk勉強会@京都

濱崎治 osamu.hamasaki @ gmail.com
2009年 5月 16日 (土) 01:04:49 JST


こんばんは。
ゆうべは遅くまで起きていたので、今朝(もう昨日の朝ですね。。。)は
眠たかったです。

> センダの話題のところで出てきた
> > Compiler evaluate: 'self printString' for: 3 logged: false
> > のお話は、その場ではちょっと消化不良だったので、帰宅してから
> > Compilerのやっていることを読んでおりました。
>

何が消化不良だったのかというと、

「メッセージ送信はどこにいったの???」

だったんです。(ブラックブックやSmalltalkイディオムの中では、
「センダ」、「レシーバ」は、メッセージ送信の概念の中で語られて
いますから。)

それでCompiler class>>evaluate:for:logged:から読み始めると、
引数の文字列で表現されているプログラムからCompiledMethodを
作って 、そのメソッドをどのクラスのメソッド辞書にも登録せずに
直接実行しているところに辿り着いたという訳です。
(Compiler evaluate: 'self halt' for: 3 logged: false. を実行して、デバッガの
助けも借りました。)

Compiler evaluate: 'thisContext sender receiver printString' for: 3 logged:
> false
>
> これは誰のために評価するのかという立場を明示したプログラムで
> して、thisContext(aMethodContext)にsenderとreceiverの単項メッ
> セージを送信しています。


> '3'が応答されるまでの経緯を追うことができれば、センダとレシー
> バの柵(しがらみ)が分かると思います。


とは言え、MethodContextのインスタンスが作られるのは仮想マシン
内部での出来事なので、完全に追うのは難しいかと思います。
ブルーブックを読みましょう(^^)
(デバッガ&インスペクタの助けを借りれば、ブルーブックを読まず
とも、なんとかなるかなあ。。。)

Osamu Hamasaki
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://www.smalltalk.jp/pipermail/sml/attachments/20090516/19230a95/attachment.htm


SML メーリングリストの案内