大抵のプログラミング言語では名前解決はほとんど空気みたいなものだ。 いちいち意識したりしない。 言語によってはルールが複雑だったり奇妙だったりすることもあるが、あくまで言語に組込みの機能であって、カスタマイズの余地はあまりないのが普通だ。
その中で Scheme の datum->syntax は特異な機能だと思う。 スコープの規則を曲げることが出来る。
以前にスコープの規則を曲げる例として let/scope というマクロを書いた。 再掲する。
(define-syntax let/scope (lambda(x) (syntax-case x () ((k scope-name body ...) #'(let-syntax ((scope-name (lambda(x) (syntax-case x () ((_ b (... ...)) #`(begin #,@(datum->syntax #'k (syntax->datum #'(b (... ...)))))))))) body ...)))))
このマクロが Ypsilon で期待通りに動かない場合を発見した。
(let ((a 1)) (let/scope L1 (let ((a 2)) (let/scope L2 (let ((a 3)) (let/scope L1 (let ((a 4)) (L2 (L1 a)))))))))
Ypsilon 0.9.6-update3 ではエラーになり、 mosh 0.2.1 と petite chez scheme 7.4d では期待通り 1 が返ってきた。 Ypsilon のバグだと思う。
[追記] Ypsilon 0.9.6-trunk/r503 では修正されていた。 [/追記]
Document ID: 4c4ee53e6e3d59eabc82d912efdc4208