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 を使ってるらしいけど、それも含めては追う気はない。まいっか。