9
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

何の記事?

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
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
9
Help us understand the problem. What are the problem?