ASDF2メモ — #:g1

Posted 2011-01-01 11:25:00 GMT

年も明けたということで、自分もライブラリ管理はQuicklispメインにし、ASDFからASDF2に乗り換えてみることにしました。
今のところQuicklisp(ver. 2010121400)は自前のライブラリの登録の方法はASDF1風に*centeral-registry*に登録させるようですが、ASDF2の方法で登録してもql:QUICKLOADできるようです。
ASDF2については自分は曖昧な知識で書いていますので詳しくは、(http://common-lisp.net/project/asdf/asdf.html)を参照のこと。
間違いがあったら教えて頂けると嬉しいです。

ASDF2に.asdファイルを登録する

まず、ASDF2は、後方互換でasdf:*central-registry*を使うことができるようですが、ややこしい気がするので自分は、新しいASDF2方式に統一することにしました。
新しい方式は、マニュアルの7 Controlling where ASDF searches for systemsに詳しく書いてありますが、UNIXのシェルのように設定ファイルをシステム全体で定義したものからユーザー定義のものへと段階的に読み込むような仕様になっているようです。
色々ありますが、とりあえず、ユーザーが定義するファイルは、"ホームディレクトリ/.config/common-lisp/source-registry.conf"となる様子。
もう一つの形式として、ファイルではなくディレクトリを設定し、てその下の.confという名のファイルを名前順に読み込んで行く、という方式があるようです。
自分は、特に理由はありませんが、なんとなくで後者の方式で行くことにしました。利用しているOSは、Ubuntu 10.10です。
~/.config/common-lisp/source-registry.conf.d/setq-asd.conf
というファイルに
;; -*- mode:lisp; -*-

;; MCCLIM-UIM (:directory "/share/sys/cl/src/mcclim-uim/")

;; EXECUTOR (:directory "/share/sys/cl/src/executor_latest/")

;; PERGAMUM (:directory "/share/sys/cl/src/pergamum/")

;; XYZZY-COMPAT (:directory (:home "lisp/src/repos/CodeRepos/commonlisp/xyzzy-compat/"))

;; ZETALISP-COMPAT (:directory (:home "lisp/work/zl/"))

;; JP (:directory "/share/sys/cl/src/jp_0.1.0/")

;; SERIES-EXT (series jp) (:directory (:home "lisp/work/series-ext/"))

;; SHIBUYA.LISP (trivial-utf-8 drakma cl-ppcre) (:directory (:home "lisp/work/shibuya.lisp/"))

;; CLAP (closer-mop :osicat) (:directory (:home "lisp/work/clap/"))

;; G000001 (series-ext series executor) (:directory (:home "lisp/work/g000001/"))

;; from github (:tree "/share/sys/cl/src/github/")

;; STARLISP-SIMULATOR (:directory (:home "lisp/work/Starlisp-simulator/"))

;; COM.INFORMATIMAGO.COMMON-LISP (:directory "/share/sys/cl/src/com/informatimago/common-lisp/")

のように書いています。
Quicklispに登録されているものは当然ながら書く必要はないため、登録されていないものを記述します。
:directoryと:treeの違いですが、treeは再帰的にディレクトリを下降して.asdファイルを探し出し、登録します。
:homeというのはホームディレクトリ以下ということを表わします。
登録したら、(asdf:INITIALIZE-SOURCE-REGISTRY)を実行し、登録一覧を更新します。
あとは、(ql:QUICKLOAD :foo)でも、(REQUIRE :foo)でもライブラリを読み込むことができるようになると思います。
REQUIREは、モジュールを読み込むための機能としてCLtL1で定義されましたが色々機能が曖昧だとかでANSIでは、非推奨(deprecated)になってしまいました。
各処理系によってまちまちですが、このREQUIREに自前のライブラリをロードする仕組みを当てている処理系が多いようですが、SBCLなどは、REQUIREでASDFが機能します。
これまで自分は、非推奨なのでREQUIREを使うのもちょっと嫌だなと思っていたのですが、見た目もすっきりするのでREQUIREも積極的に使ってみることにします。
ちなみに、CL/Emacs lisp共にREQUIRE、PROVIDEがありますが動作としては別物です。

comments powered by Disqus