syntax-rules corner case 地獄その2 (3だっけ?)
ここ数週間、やる気が起きなくてなーーーーんもしてなかったけど、やっとこさ再開。
いきなり灰色い code を思いつく。幸先がいいのか悪いのか。
;; Shadow the binding of literal symbol foo with a) let and b) let-syntax (let-syntax ((macro (syntax-rules (foo) ((_ foo) 'match) ((_ bar) 'mismatch)))) (list (macro foo) (let ((foo 0)) (macro foo)) (let-syntax ((foo (syntax-rules () ((_) -1)))) (macro foo) ))) --> (match mismatch mismatch) [ guile, 多分 ChezScheme ] <del> --> (match match match) [ Gauche, Scheme48 ] </del> 間違い。 どれでも (match mismatch mismatch) と出る。
あれ? っていうか Gauche/scheme48 のこの二つめのはおかしくないの? 束縛が違うはずだけど match してるぞ。
追記: あれ? Gauche/Scheme48 でも (match mismatch mismatch) になるぞ…記憶混濁? (汗 xfce-terminal の scroll buffer に残ってた。違うものコピペしてたよ。アホすぎ。
で、まあ原理的には macro だけ名前空間分ける事になるかと身構えたけど、流石にそこまではやってもしょうがないかと結論づけた。…本当はやった方がいいんだけどね、今書いてる物体では第一級 object として scope 外に放り出されると予想つかない挙動するから (crash はせんけど)。
Ellipsis の実装が gauche のパクリみたいになって嫌だ。しかし guile (ていうか ChezScheme) の実装はようわからん。独自の tagged sequence を使ってるらしいけど、それも含めては追う気はない。まいっか。