ASDF

実践Common Lispのサンプルコードを入手して中をみていたら.lispファイルに混じって、.asdという拡張子のファイルが含まれている。こいつはASDF(Another System Definition Facility)と呼ばれるCommon lispのパッケージ管理システムで使用するファイルらしい。asdfってキー配列を意識しているのか?
使い方は、
http://practical-scheme.net/wiliki/wiliki.cgi?CommonLisp%3Aasdf
を参考にして23章の実践SPAMフィルタのコードを動してみる。SPAMフィルタは、cl-ppcreと呼ばれるperl互換の正規表現ライブラリと15章のpathnameというパッケージを使用する。cl-ppcreもサンプルコードの中に含まれているので、これらを一緒にロードしてあげればよい。

$ pwd
/Users/patterson
$ mkdir -p cl/systems
$ cd cl/systems
$ ln -s .../cl-ppcre.asd .        #実践Common Lispのサンプルコードの中に入っている
                                  #cl-ppcre.asdのシンボリックリンクをcl/systemsの下に置く 
$ ln -s .../chapter-15.asd .      #上と同じようにchapter-15も
$ ln -s .../chapter-23.asd .      #上と同じようにchapter-23も

ここまでやったらREPLで、

CL-USER> (setf asdf:*central-registry*
	       '(*default-pathname-defaults*
		 #p"/Users/patterson/cl/systems/"     ;;さっき作ったディレクトリを指定
		 #p"/usr/share/common-lisp/systems/"))
(*DEFAULT-PATHNAME-DEFAULTS* #P"/Users/patterson/cl/systems/"
 #P"/usr/share/common-lisp/systems/")
CL-USER> (asdf:operate 'asdf:load-op 'cl-ppcre)  ;;正規表現ライブラリのロード
...
CL-USER> (asdf:operate 'asdf:load-op 'chapter-15) ;;15章のcom.gigamonkeys.pathnameパッケージのロード
...
CL-USER> (asdf:operate 'asdf:load-op 'chapter-23) ;;23章のcom.gigamonkeys.spamパッケージのロード
...
CL-USER> (in-package :com.gigamonkeys.spam)
#<The COM.GIGAMONKEYS.SPAM package>
SPAM> (extract-features "foo bar baz foo bar")
(#<WORD-FEATURE "baz" :hams 0 :spams 0>
 #<WORD-FEATURE "foo" :hams 0 :spams 0>
 #<WORD-FEATURE "bar" :hams 0 :spams 0>)

使えるようになった。でも

CL-USER> (setf asdf:*central-registry*
	       '(*default-pathname-defaults*
		 #p"/Users/patterson/cl/systems/"
		 #p"/usr/share/common-lisp/systems/"))

は、毎回やるのは面倒だ。どこに設定してあげるのがよいのか?Allegro CLでは~/.clisp.lispに初期化処理を書くことができるとWebでみたので、ここが最適なのかな?