2011年11月22日火曜日

Common Lispでの、依存関係を考慮したファイルロード


Common Lispにおいて、asdfを使って、依存関係を考慮してプロジェクトの構成ファイルをロードする方法をまとめました。

動機
よっぽど小さなプログラムでない限り、プログラムの規模が大きくなってくると、ファイルを複数に分けることになります。

困ったことに、Common Lispには、依存関係をみて必要なファイルをロードする機能がありません。なので、ファイルを複数に分けると、必要なファイルを1つ1つロードするはめになります。

asdfを使うことで、ファイルの依存関係をみて必要なファイルを1度にロードすることができます。

asdfとは?
asdfは、"Another System Definition Facility"の略で、Common Lispプログラムを1つの「モジュール」として管理し、読み込むことができるツールです。現在はASDF2が広く使われています。

makeや、JavaのAntに相当するもので、PerlのCPANやRubyのRubyGemsの1つ下のレイヤに位置づけられます。CPANやRubyGemsにあたるものとしては、asdf-installがあります。

以下のような「sample」プロジェクトがあるとします。
sample
 - caller.lisp  ;; callee.lispで定義されている関数を使う
 - callee.lisp  ;; caller.lispから呼ばれる
 - sample.asd   ;; asdfモジュール定義ファイル

各ファイルの内容は以下のようになっています。
$ cat caller.lisp
(in-package :common-lisp)

(defpackage sample.caller
  (:use :common-lisp
        :sample.callee))
(in-package :sample.caller)

(hello-world)

$ cat callee.lisp 
(in-package :common-lisp)

(defpackage sample.callee
  (:use :common-lisp)
  (:export :hello-world))
(in-package :sample.callee)

(defun hello-world ()
  (print "Hello, World!"))

$ cat sample.asd 
(defsystem "sample"
  :components ((:file "callee")
               (:file "caller"))
  :serial t)

sample.asdがasdfから参照されるように設定し、common lispを起動します。

以下の関数を評価することで、sampleプロジェクトをロードすることができます。sample.asdの:serialオプションによって、ファイルの依存関係を考慮した形でファイルがロードされます。
(asdf:load-system 'sample)


--

0 件のコメント: