質問: **※注: シンボルが競合しないようなアナフォリック・マクロの作り方の質問ではありません。** アナフォリック・マクロを提供するライブラリには、anaphora、arnesi、kmrcl等々がありますが、これらを混ぜて使うとitが競合します。 また、競合しないようにするとなると、 ``` (kl:aif foo kl:it (anaphora:aand kl:it anaphora:it)) ``` のようにパッケージ名を明記することになり残念です。 itは共通のパッケージから継承するようにすれば、大体解決しますが、もっとスマートな方法はないでしょうか。 なお既存のライブラリにコード修正は加えないことを前提とします。 ``` (intern "IT" :cl-user) (defpackage :kmrcl (:import-from :cl-user :it)) (defpackage :anaphora (:import-from :cl-user :it)) (ql:quickload :anaphora) (ql:quickload :kmrcl) (in-package :cl-user) (anaphora:aif 'foo (kmrcl:aif it it)) ;=> FOO ```
回答: ANSI Common Lispのパッケージの規格を確認してみたところ、パッケージを破壊的に変更するとパッケージの中身は未定義になるということなので、厳密にいうと、IT専用の共通パッケージを作成し、そのシンボルを差し込むという作戦は、処理系依存のようです。 実際、ABCLでは上手く動きません(確認したところでは、ABCL以外は上手く行く) どうやら > > 既存のライブラリにコード修正は加えない > > > という条件は厳しいようですね。 なんにしろ共通のシンボルを使う以外のアイデアは難しいようですので一旦クローズとしたいと思います。