2019/11/18

これからCommon Lispに入門する人たちへ

インストール

私が最初に躓いたのが、このインストールであります。大抵の言語はバージョンが違う程度でインストール方法はだいたい決まっています。しかしCommon Lispの場合、種類がありすぎてわからないのであります。SBCL(Steel Bank Common Lisp)、 CMU Common Lisp、GNU Common Lisp、 CCL(Clozure Common Lisp)、 商用ではAllegro Common Lisp、 Lispworksなどいろいろあります。これが、「よし!Lisp勉強してみよう!」という意気込みをいきなりサゲてくるのであります。なんとも初心者泣かせの言語であります。

しかし近年では、roswellというものが開発され、Lisperの方々が積極的に使っているので、こちらをインストールするという方法が良いようです。このroswellは、デフォルトでSBCLがインストールされますが、他の処理系もインストール可能なようなので、roswellを使えば最初の躓きを回避できます。またサードパーティ製ライブラリのインストールに必要なQuicklispも同梱されています。
roswellのインストールはこちら
またPortacleというLisp開発のための環境(SBCL、Quicklisp、Git、Emacs)をパッケージにしたものもあります。こちらはUSBメモリにまるごと入れることもできるようです。
Portacleのインストールはこちら
いづれもメインとなっているのはSBCLなので、どうやら最初はSBCLを選ぶのが良いようです。
SBCLのみのインストールはこちら

REPL

インストールしたらREPL(ReadEvaluatePrintLoop)と呼ばれる対話シェルでいろいろ試すことができます。例えばSBCLをインストールした場合はsbclで、roswellをインストールした場合はros runで起動することができます。起動すると*という入力待ちのプロンプトが表示されます。あとはいろいろコードを試すのみ。と言いたいところですが、私が初めて使って、まちがったコードを入力した時、「わけわからん」表示になり、ズラズラと英語が表示されました。今では理解できますが、最初は「は?」とイラっとくるかもしれません。例えば以下のように:::と無意味なコードを入力した場合、以下のような表示になります。

* :::

debugger invoked on a SB-INT:SIMPLE-READER-ERROR in thread
#<THREAD "main thread" RUNNING {10005285B3}>:
  too many colons after #<PACKAGE "KEYWORD"> name

    Stream: #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {100001E533}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-IMPL::READ-TOKEN #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN*{100001E533}> #\:)
0] abort
*
この場合、上記の最後から2行目のようにabortとすれば、正常な状態に戻ります。
そしてREPLの終了は(quit)でできます。
REPL内だけでコードを試してみるのも良いですが、せっかく書いたコードを保存して、次にまた使えるようにしたい場合、.lispという拡張子でファイルを保存しておきます。例えば以下のようなhello.lispというファイルにgreetingという関数を定義して保存しておきます。

(defun greeting (name)
  (format t "Hello, ~A!!~%" name))
上記のコードで使われているdefunは関数を定義する際に使います。(defun 関数名 (引数) 処理)という形で使います。
そしてREPLで読み込んで使うことができます。

* (load "hello.lisp")
T
* (greeting "Tom")
"Hello, Tom!!"
NIL
またLispの開発で定番となっているSLIMEというものがあります。例えばEmacsをお使いの場合、ウィンドウを分割して、片方でファイルの編集、もう片方でREPLという形で、ファイルで記述したコードをその場で検証できる環境を作ることができます。最近ではVimやEmacsのように自分で設定せずともすぐにSLIMEが使えるエディタlemというものが開発されており、Lisperの間で使われているようです。私も使うようになりました。lemについてはこちら
私はまだまだ初心者なので、本格的なプログラムについては何も語る資格はございませんが、初心者だからこそ分かるこの最初の躓きを取り除きたいと考えこの記事を書きました。お役に立てばなによりです。

追記(2021/03/02)

新たにSBCLのみの環境におけるASDFの設定に関する記事も追加しました。こちら