8098


**※注: シンボルが競合しないようなアナフォリック・マクロの作り方の質問ではありません。**

アナフォリック・マクロを提供するライブラリには、anaphora、arnesi、kmrcl等々がありますが、これらを混ぜて使うとitが競合します。

また、競合しないようにするとなると、

[code]

    (kl:aif foo kl:it
            (anaphora:aand kl:it anaphora:it))
    
[/code]

のようにパッケージ名を明記することになり残念です。

itは共通のパッケージから継承するようにすれば、大体解決しますが、もっとスマートな方法はないでしょうか。

なお既存のライブラリにコード修正は加えないことを前提とします。

[code]

    (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
    
[/code]


CC BY-SA 3.0
2014-12-19T10:47:30.597
2134
2015-03-19T05:07:51.447
3510
question
common-lisp
アナフォリック・マクロを提供するライブラリのitの競合を回避したい


ANSI Common
Lispのパッケージの規格を確認してみたところ、パッケージを破壊的に変更するとパッケージの中身は未定義になるということなので、厳密にいうと、IT専用の共通パッケージを作成し、そのシンボルを差し込むという作戦は、処理系依存のようです。  
実際、ABCLでは上手く動きません(確認したところでは、ABCL以外は上手く行く)  
どうやら

> 既存のライブラリにコード修正は加えない

という条件は厳しいようですね。  
なんにしろ共通のシンボルを使う以外のアイデアは難しいようですので一旦クローズとしたいと思います。


CC BY-SA 3.0
2015-03-19T05:07:51.447
8098
2015-03-19T05:07:51.447
3510
2134
answer