只今記号操作中

 | 

2008-02-11

[][][][] ステップ実行eval開発中(3) 06:19

回り道したが、これを発見した。凄い有難い。


で、問題のコードはcompile.scmのpass1のところにあった。

evalの第一引数のlistの先頭が何なのかをpass1/lookup-headで調べているが、ここが既に実体のマクロやspecial formだった場合にスルーされてしまうのが原因のようだ。

;; Check if the head of the list is a variable, and if so, lookup it.
;; Note that we need to detect the case ((with-module foo bar) arg ...)
;; NB: This isn't a proper fix, for we cannot deal with the situation
;; like nested or aliased with-modules.  The Right Thing is to run
;; `pass1 for syntax' on (car PROGRAM) and check the result to see if
;; we need to treat PROGRAM as a special form or an ordinary procedure.
;; It would be a large change, so this is a compromise...

というコメントがあるのが気になるが、とりあえず試してみる。

shiroshiro 2008/02/11 08:54 マクロやsyntaxの実体がcar部に来た時にそれをマクロや構文キーワードが来たかのように扱うのはfirst class macroとか呼ばれたりしますが、一貫性のある意味づけが難しいんですよ。
例えばそれを許すと
(for-each (lambda (z) (z #t ’ok (destroy-the-world))) if)
みたいな書き方をされた時にどうするの、とか。

ranekovranekov 2008/02/11 11:26 ちょっと長くなったので、返事はWiLiKiの方に書きます。
(修正にcompile.scmのpass1/lookup-headを修正したら、これがpass1/bodyからも呼ばれてたので、そっちに影響を与えないかの検証が終わってから……)

ranekovranekov 2008/02/11 18:54 あれから色々考えて、確かに、実は奥が深くて、難しい事に気付きました……。
WiLiKiの方に、もう少し追記します。

トラックバック - http://d.hatena.ne.jp/ranekov/20080211/1202678378
 |