不確定特異点

広く深く、ところどころ超深く

Common Lisp 処理系と開発環境のインストール (1)

最近、新しい環境に Common Lisp の処理系をインストールすることがあったので、そのときに調べた内容をまとめておきます。まずは SBCL という Common Lisp の処理系をインストールします。(他にも Clozure CL とかでもいいと思います。)

MacOS の場合

$ brew install sbcl

Debian GNU/Linux の場合

$ apt-get install sbcl

端末から sbcl コマンドを実行して REPL (インタラクティブシェル)が起動することを確認します。Common Lisp は他のプログラミング言語とは違い、REPL を使って開発することが前提となっているようです。REPL はプログラムを小さな単位で動作させながら、インクリメンタルに開発を進めることが可能なため、慣れるととても便利です。

もちろん他のスクリプト言語と同様に、コマンドライン上でスクリプト的に実行することも可能です。試しに Common Lisphello world をやってみます。hello.lisp という名前のファイルに、

(format t "hello, world!~%")

と書いて保存します。そして、コンソールから次のように実行します。

$ sbcl --noinform --non-interactive --load hello.lisp
hello, world!

めでたく hello, world! が表示されました。各オプションの意味は以下の通りです。

  • --noinform は起動時のメッセージを抑制させるためです。
  • --non-interactive はエラーが起きた場合にデバッガが起動しないようにするためです。また、実行終了後に自動的に REPL を抜けます。
  • --load で引数にとったファイルをロードします。

実は sbcl には--scriptというオプションがあり、スクリプト実行するだけならこのような長いオプションを指定する必要はないのですが、起動時に自動的に読み込まれる $HOME/.sbclrc という設定ファイルの読み込みが無視されてしまうため使ってません。($HOME/.sbclrc は後述の Quicklisp の設定をするために必要になります。)

通常のスクリプトのように、ファイルをそのまま実行するためには hello.lisp を次のように書きます。

#|
exec /usr/local/bin/sbcl --noinform --non-interactive --load "$0" "$@"
|#

(format t "hello, world!~%")

シェルスクリプトPerl/Python/Ruby のような言語では行頭に#!(shebang)を使って実行コマンドを指定するのが普通ですが、ここで#!としていないのは、sbcl に exec してこのファイルを load すると、行頭の#記号をコメント行と見なせなくてエラーとなってしまうからです。(リードマクロを設定すればコメント扱いにできると思います。)そこで、Common Lisp にとって無害なブロックコメント#|を行頭に書きます。そうなると、#!じゃなくて sbcl を起動できるの?と思いますが、その場合は OS がシェルを起動するようになっているため、問題なく2行目の exec を通して sbcl が実行されるようです。ちなみに3行目以降に何が書かれていようが、シェルは sbcl に exec してしまっているので無視されます。このハックは あなたの知らないShebang を参考にさせて頂きました。

これでスクリプトっぽく実行できるようになりました。

$ ./hello.lisp
hello, world!