マクロの健全性
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がうまくやってくれるかららしい。お利口さん。