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 件のコメント:
コメントを投稿