2021/02/28

シンプルにSBCLのみのCommon Lisp環境を作るためのメモ

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

初回のようにコンパイル云々とならず、すぐに使えます。