Let's start Scheme

2011-05-08

(再)letrec-syntaxにはまる

実際にはlet-syntaxだが、どちらも同じなので。
あんまりR6RSの仕様書をまじめに読んでないことが分かってしまうのだが、こんなコードにはまる。
;; (1)
(let () 
  (let-syntax ((def (syntax-rules ()
        ((def stuff ...) (define stuff ...)))))
    (def foo 42))
  foo)
;; (2)
(let-syntax ((def (syntax-rules ()
      ((def stuff ...) (define stuff ...)))))
  (def foo 42))
foo
R5RSでは上記のコードは不正になる。let(rec)-syntaxはおそらくスコープを作るのだろう。(Gaucheで確認しただけで、R5RSを読んだわけではない)
っが、R6RSではこれはOKで、let(rec)-syntaxはbeginと同じなのだそうだ。なので、(1)の場合は単なるinternal defineに展開されると考えればいいのだろう。
explicit phasingでlet-syntaxが展開された後のことを考えればそうなのかもしれないが、(2)のケースを考えると納得がいかないなぁ。

どちらにしろ、これは直さないと。でも、とりあえず先送りにしよう。こんな書き方することはないだろうし。

No comments:

Post a Comment