Shammer's Philosophy

My private adversaria

asdf-install

Lispではライブラリを追加する際にasdf(a system definition facility)というもの?仕組み?を使う。ただ、使えるようにするためにはちょっとした追加作業が必要。Clozure CL の場合は、

 HintsForAsdfAndOpenmcl – Clozure CL

に説明がある。自分の場合、MacPortsを使ってClozure CLをインストールしたので、For MacPorts Usersの項を見て同じようにやってみたのだが・・・うまく行かなかった。以下のエラーが出る。

? (asdf:operate 'asdf:load-op 'asdf-install)
> Error: Error component "asdf-install" not found
> While executing: #<STANDARD-METHOD ASDF:FIND-SYSTEM (STRING)>, in process listener(1).
> Type :POP to abort, :R for a list of available restarts.
> Type :? for other options.
1 > 

原因はおそらくバージョンの違いで、asdf-installの場所が変わったことのような気がした(と言っても、Clozure CL のサイトにある1.4を使ってまでやってみようとは思わないし、そもそもMacPortsで古いバージョンのClozure CL入手できるか試したり調べるのも面倒だし・・・)。
具体的には、このコマンドがポイント。

 ? (push "/opt/local/share/asdf-install/" asdf:*central-registry*)  ; Macports-installed stuff

ここで指定する、asdf-installというディレクトリには、asdfの実体がいろいろとないとNGなんだと思う。1.4はこのPATHだったのかもしれないが、1.6だと別のPATHになる。上のコマンドを下記のようにするとうまくいった。

(push "/opt/local/share/ccl/1.6/tools/asdf-install/" asdf:*central-registry*)

Clozure CL を Terminal 内で起動してからの一連の手順をまとめると以下のような感じだった。

Welcome to Clozure Common Lisp Version 1.6  (DarwinX8664)!
? (require 'asdf)
ASDF
("ASDF")
? (push "ccl:tools;asdf-install;site-systems;" asdf:*central-registry*)
("ccl:tools;asdf-install;site-systems;")
? (push "/opt/local/share/ccl/1.6/tools/asdf-install/" asdf:*central-registry*)
("/opt/local/share/ccl/1.6/tools/asdf-install/" "ccl:tools;asdf-install;site-systems;")
? (asdf:operate 'asdf:load-op 'asdf-install)
; loading system definition from /opt/local/share/ccl/1.6/tools/asdf-install/asdf-install.asd into #<Package "ASDF0">
; registering #<SYSTEM ASDF-INSTALL> as ASDF-INSTALL
;;; ASDF-Install version 0.6.10
#<LOAD-OP NIL #x30200063749D>
((#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "defpackage">) (#<LOAD-OP NIL #x302000644E1D> . #<CL-SOURCE-FILE "asdf-install" "defpackage">) (#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "split-sequence">) (#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "port">) (#<LOAD-OP NIL #x30200064378D> . #<CL-SOURCE-FILE "asdf-install" "port">) (#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "variables">) (#<LOAD-OP NIL #x302000642ADD> . #<CL-SOURCE-FILE "asdf-install" "variables">) (#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "conditions">) (#<LOAD-OP NIL #x30200064889D> . #<CL-SOURCE-FILE "asdf-install" "split-sequence">) (#<LOAD-OP NIL #x302000647C1D> . #<CL-SOURCE-FILE "asdf-install" "conditions">) (#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "installer">) (#<LOAD-OP NIL #x302000646F5D> . #<CL-SOURCE-FILE "asdf-install" "installer">) (#<COMPILE-OP NIL #x3020006411FD> . #<CL-SOURCE-FILE "asdf-install" "deprecated">) (#<COMPILE-OP NIL #x3020006411FD> . #<SYSTEM "asdf-install">) (#<LOAD-OP NIL #x30200063749D> . #<CL-SOURCE-FILE "asdf-install" "deprecated">) (#<LOAD-OP NIL #x30200063749D> . #<SYSTEM "asdf-install">))
? (asdf-install:install 'md5)
Install where?
1) System-wide install: 
   System in /usr/local/asdf-install/site-systems/
   Files in /usr/local/asdf-install/site/ 
2) Personal installation: 
   System in /Users/shinpei/.asdf-install-dir/systems/
   Files in /Users/shinpei/.asdf-install-dir/site/ 
0) Abort installation.
 --> 0

? 

あとはこれを自動化できるようにすればいい。.ccl-init.lispに書けばいいのか?今度やってみよう。