マクロの健全性

id:yagiey:20100127:1264595558のorマクロを使って次のようなコードを書いたとする。

(let ((tmp 2))
  (or #f tmp))

orを素直に展開すると

(let ((tmp 2))
  (let ((tmp #f))
    (if tmp tmp tmp)))

ってなって、展開前に意図した結果が得られない。困った。


さらに、次のような場合はどうだろう。

(let ((if list))
  (or 1 2))

同様にorを展開すると

(let ((if list))
  (let ((tmp 1))
    (if tmp tmp 2)))

ってなってしまう。これも困った。


でも、実際は両方ともこんな風に展開されず、うまくいく。
それは、名前が衝突しないようにSchemeがうまくやってくれるかららしい。お利口さん。