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