CommonLisp
asdf

SBCL + ASDF3 +QuickLispでプロジェクトの作り方

More than 1 year has passed since last update.

何の記事?

SBCL(Steel Bank Common Lisp)でASDF3 (Another System Definition Facility) と
QuickLispを使ってプロジェクトの作り方からロードの仕方までを簡単に説明します。
プロジェクトの作成にはQuickLispからインストールするcl-projectを使います。

プロジェクトを作る

QuickLispのインストール

QuickLispのWebサイトからquicklisp.lispをダウンロードして
REPLで以下を実行します。

(load "quicklisp.lisp")
(quicklisp-quickstart:install)
(ql:add-to-init-file)

cl-projectのインストール

REPLで以下を実行します。

(ql:quickload :cl-project)

cl-projectでプロジェクト作成

REPLで以下を実行します。
カレントディレクトリのfoo/にプロジェクトのフォルダができます。

(ql:quickload :cl-project)
(cl-project:make-project #p"foo/")

.sbclrcの設定

SBCLでASDFがカレントディレクトリを見に行くように設定します。

~/.sbclrc
;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

;; ここから
(setf asdf:*central-registry*
  '(*default-pathname-defaults*))
;; ここまでを追加

ASDFでロード

REPLで以下を実行すると作成したプロジェクトをロードすることができます。

(asdf:operate 'asdf:load-op 'foo)

試してみる

プロジェクトfooを作成して、foo/src/foo.lispを以下のように変更。

foo/src/foo.lisp
(in-package :cl-user)
(defpackage foo
  (:use :cl)
  (:export :hello))
(in-package :foo)

(defun hello () (print "hello ASDF!"))

プロジェクトのフォルダをカレントディレクトリにして、
REPLで以下のように実行する。
(カレントディレクトリ以下を再帰的に探索してくれるらしいので、
プロジェクトのフォルダより上の階層ならどこでもいいはず。)

(asdf:operate 'asdf:load-op 'foo)

プロジェクトが読み込まれるので、ここで

* (foo:hello)

"hello ASDF!"
"hello ASDF!"

となれば成功。

いくつかのファイルをロードする必要があるときは、foo/foo.asdファイルを変更する。
foo/src/bar.lispを読み込みたければ以下のようにする。

foo/foo.asd
(defsystem foo
  :version "0.1"
  :author ""
  :license ""
  :depends-on ()
  :components ((:module "src"
                :components
                ;; ここに必要なファイルを追加していく。
                ((:file "foo")
                 (:file "bar")))))
.....

環境

  • OS : Windows 10 x64
  • 処理系 : Steel Bank Common Lisp 1.3.7