只今記号操作中

 | 

2008-02-11

[][][][] ステップ実行eval開発中(2) 04:04

要は、

((eval `(,lambda (arg) arg) (interaction-environment)) 123)
=> 123

のように、evalに対して、マクロやspecial formの「実体」を渡した時にも、evalがそれをマクロやspecial formとして扱ってくれれば問題は解決するのだが、とりあえずGaucheはそう扱ってはくれなかった。

(そもそも、evalにシンボルでない実体を渡した時の挙動自体がR5RS外のような気はする。しかし未確認。)

ので、自前で展開する必要があると思ったのだが、どうにも大変そうだ。

evalがマクロ類の実体を扱ってくれれば楽なのに……と思い、Gauche本体の方に手を入れる方向もある事に気付いた。

とりあえず、guileは前述の式を与えたところ、自分の望んでいる通りに機能しているので、そういう挙動にしてもいい裏付けは無くはないようだ。

とりあえず今からパッチ書いてみる事にする。

採用されるかは謎。そもそも楽にパッチ書けるのかも謎。

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/1202670295
 |