ステップ実行eval開発中(9)

internal defineも正常に機能していない事に気付いた。
ちゃんとtest caseを書かないと駄目だなあ。


defineは、トップレベルで呼ばれた時と、let等の内部で呼ばれた時とで挙動が違う。
これは、defineの内部で、トップレベルで呼ばれたのかlet等の内部で呼ばれたのかの判定をしている……と思っていたら、これもquasiquoteと同様のロジックのようだ。
試しに、以下のコードを実行したらエラーになった。

(define def define)
((lambda () (define (abc) 3) (abc))) ; => 3
((lambda () (def (abc) 3) (abc))) ; => syntax-error

内部defineは、シンボルdefineでないといけないようだ。
どうも、lambdaやletが、body開始直後のシンボルdefineを検知して勝手に展開しているような雰囲気だ(これも実際のコードを追って確認してないので、確証は無い)。
とりあえず、これまた仕様という事で逃げる事にする。


mzschemeでは、そもそも、(define def define)のように、syntaxを別の束縛にも結び付ける挙動自体がエラーになる。
これもR5RS外の操作だけど、今からステップ実行evalを作り直す事は時間的にできない。
とにかくデモできるところまで進めよう。