マクロでもやもやと

嫁の買い物とか初詣に付き合う間、Lispで悶々と考え事をしていた。

マクロの展開処理を記述している時に悩んでいたことを考え直している間に、あたりまえのことに気づいた。
Lisp1で古典的マクロは問題があるという認識であったが、関数とかシンタックスとかマクロ自体を自己評価可能なオブジェクトにしておけば、簡単に回避できる気がする。

(mac (aif test1 then1 else1)
 `(let1 it ,test1
   (if it ,then1 ,else1)))

という感じで書いていたが、

(mac (aif test1 then1 else1)
 `(,let1 it ,test1
   (,if it ,then1 ,else1)))

と書けば、let1とかifがsyntaxとか関数とかマクロに評価されるので、レキシカルに定義を記述しておけばモジュール化可能な気がする。

あとは、複数のモジュールにソースを分ける際に、他のモジュールから変数をインポートしたとして、その変数名が短いとコンフリクトしかねない。
そこら辺も解決してみたい。