Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-11-21

アナフォリックマクロのITをどうするか

| 20:54 | アナフォリックマクロのITをどうするか - わだばLisperになる を含むブックマーク はてなブックマーク - アナフォリックマクロのITをどうするか - わだばLisperになる

アナフォリックマクロを提供しているユーティリティ集は割とあるのですが、束縛を参照するためのITやSELFも同じパッケージのものを対で使わなくてはいけないので、複数パッケージを混ぜて使う場合は面倒です。

具体的にどういうケースがあるかというと、KMRCLからはAIF、FARE-UTILSからは、AANDを使うとすると、どちらかのITはパッケージ名を付けなくては機能しません。

マクロの作り方自体を工夫すればこういうこともないかもしれませんが、既存のライブラリを書き換えるのも面倒です。

どれか一つを選んで使うというのもありなのですが、できれば複数を同時に使いたい。

大本のパッケージがITをEXPORTしていれば良い

ということで、どんなライブラリでもCLパッケージは継承していることを利用し、CLパッケージがITをEXPORTするようにしたら良いのではないかと思い、実際に試してみました。

しかし、結果としては、処理系内部でもITを使っていることがあるらしく、競合の解消が面倒な様子。

しょうがないので、ITパッケージを作って、ITとSELFだけをエクスポートするものを作成して、アナフォリックマクロを提供するパッケージは、IT:ITを継承するようにしてみました。

手順としては、ライブラリが読み込まれる前にIT:ITを含んだパッケージを作成しておいて、その後にライブラリをロードします。

(defpackage :it
  (:export :it :self))

(defmacro inherit-it (pkg)
  `(progn
     (defpackage ,pkg)
     (shadowing-import '(it:it it:self) ,pkg)))

(inherit-it :kmrcl)
(inherit-it :fare-utils)
(inherit-it :anaphora)
(inherit-it :it.bese.arnesi)
(inherit-it :mycl-util)
(inherit-it :sclf)
(inherit-it :common-idioms)
(inherit-it :elephant-utils)

(asdf:oos 'asdf:load-op :kmrcl)
〜

こうすると、各ライブラリのITはIT:ITを継承しているので使うパッケージでもIT:ITを継承しておけば、すんなり動くようです。

こんな乱暴で大丈夫なのかなあとも思いますが、アナフォリックマクロ自体飛び道具な気もするので、まあ良しとします。

ちなみに、あまり深く考えていない対処法なので、この方法に何か問題があれば教えて頂けると嬉しいです。