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でみたので、ここが最適なのかな?