#:g1: exportingの紹介

Posted 2014-04-22 17:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の113日目です。

exportingとはなにか

 exportingは、CLISPで有名なBruno Haible氏作の関数/変数定義のユーティリティです。

パッケージ情報

パッケージ名exporting
プロジェクトサイト CLOCC - Common Lisp Open Code Collection / Hg / [e6b24a] /src/ext

インストール方法

 CLOCCのプロジェクトサイトからダウンロードしてきて適当に導入します。
CLOCCは活動が停止しているものと思っていましたが、最近も更新があったりするようです。

$ hg clone http://hg.code.sf.net/p/clocc/hg clocc-hg

で全体のソースも取得できます。
src/ext/exporting/exporting.lisp が目的のソースです。

試してみる

 そもそも何をするものかというと、定義した関数/変数はエクスポートもしておきたい、というニーズを叶えるもので、定義+エクスポート、というだけのものです。
マクロ展開するとそのものズバリな内容になっています。

(exporting:defun foo (n) n)
==> (CL:PROGN (CL:EXPORT 'FOO) (CL:DEFUN FOO (N) N))

がexportingでサポートされているフォームです。

まとめ

 今回は、exportingを紹介してみました。
SBCL等では、CL:DEFPACKAGE内でエクスポートされるシンボルも定義した場合、別個に分散してCL:EXPORTで宣言したものがあると、エラーにされたりするので、CL:DEFPACKAGE内の:EXPORTは使わない等の工夫が必要になるかと思います。〈SBCLでは、CL:DEFPACKAGEの“If the new definition is at variance with the current state of that package, the consequences are undefined.”を厳しく解釈している様子〉

 exportingに似た機能を持つものは他にも幾つかありますが、個人的には、開発時には便利なものの、パッケージ/シンボルの設計は一度決まれば、そんなに変更されるものでもないと思うので、CL:DEFPACKAGEにまとめても大した手間でもないだろう、という感じです〈SLIMEだとパッケージ定義にも飛んで行けますし…〉

comments powered by Disqus