ASDFの設定
SBCLインストール後、sbcl
コマンドでREPLを起動し、以下のようにASDFのバージョンを確認します。この際、rlwrapをインストールしておくと使いやすくなります。
* (require 'asdf)
* (asdf:asdf-version)
"3.3.1"
毎回(require 'asdf)
とするのは面倒なので、home/.sbclrc
というファイルを作って以下を書いておくと良いかと思います。
(require 'asdf)
(defmethod asdf:perform :around ((o asdf:load-op) (c asdf:cl-source-file))
(handler-case (call-next-method o c)
(sb-ext:invalid-fasl ()
(asdf:perform (make-instance 'asdf:compile-op) c)
(call-next-method))))
これによって、自動でfasl再コンパイルしてくれるようになるとSBCLマニュアルには書かれています。
次にシステムを置く場所を作ります。~/common-lisp/
か~/.local/share/common-lisp/source/
かのどちらかにしておくと、デフォルトでは、そこにあるasdファイルを見に行ってくれます。
試しに作ってみる
試しに最小構成のシステムを作ってみます。私は~/common-lisp/
を置き場所にしました。そして以下のようなものを置いてみます。
/common-lisp/
hello/
hello.asd
hello.lisp
コードはそれぞれ以下のようになっています。
=========
hello.asd
=========
(defsystem "hello"
:description "asdf test"
:version "0.0.1"
:author "Mashiko Hamazawa<ichigyo.zanmai@gmail.com>"
:license "MIT"
:depends-on ()
:components ((:file "hello")))
==========
hello.lisp
==========
(in-package :cl)
(defpackage :hello
(:use :cl)
(:export :greet))
(in-package :hello)
(defun greet ()
(format t "Hello, world!!~%"))
実際使ってみると、
(asdf:load-system :hello)
; compiling file "/home/masahiko/common-lisp/hello/hello.lisp" (written 28 FEB 2021 03:25:18 PM):
; processing (IN-PACKAGE :CL)
; processing (DEFPACKAGE :HELLO ...)
; processing (IN-PACKAGE :HELLO)
; processing (DEFUN GREET ...)
; wrote /home/masahiko/.cache/common-lisp/sbcl-2.1.1-linux-x64/home/masahiko/common-lisp/hello/hello-tmpGHU3ALSV.fasl
; compilation finished in 0:00:00.003
T
(hello:greet)
Hello, world!!
NIL
とコンパイルされ、faslファイルが~/.cache/
以下に作られていることがわかります。REPLを一度閉じて、もう一度起動して同じようにしてみると、
(asdf:load-system :hello)
T
初回のようにコンパイル云々とならず、すぐに使えます。