2013年4月6日土曜日

[Raspberry Pi]Clozure CL + Quicklisp で hunchentoot

RaspbianをインストールしたRaspberry PiでQuicklispを使いたかったのだけど、提供されているLispパッケージでは、
CLISP → quicklisp.lisp のロードでSIGSEGVエラー
ECL → quicklisp.lispをインストールできたが、setup.lispでエラー(だったかな?)

となって、どちらもNGだった。

困ったなーと、Google検索していて見つけたのが、こちらのページ。
Installing Clozure Common Lisp on the Raspberry Pi
http://lispm.dyndns.org/ccl
このページを参考に、Clozure CL(以下CCL) と QuicklispをRaspberry Piにインストールし、
Webサーバーであるhunchentootを動かしてみた。

以下、hunchentootを動かすまでの手順。





前提

Raspberry PiにインストールしたOSはRaspbian
ビルドに必須のパッケージsubversion, m4を追加でインストール済み
インストール先は ~/opt

CCLインストール

$ mkdir ~/opt
$ cd ~/opt
$ svn co http://svn.clozure.com/publicsvn/openmcl/trunk/linuxarm/ccl
$ cd ccl

cclディレクトリ直下に armcl がある。
'armcl' is an executable with the CCL runtime.
実行できる。

$ ./armcl
Welcome to Clozure Common Lisp Version 1.10-dev-r15791M  (LinuxARM32)!
? (quit)

このままだとsoft floatsなので、hard floatsにコンパイルオプションを変更してビルドする。

$ cd lisp-kernel/linuxarm/
$ emacs float_abi.mk → ◆どのように変更すれば良いかは見れば分かる
$ make clean
$ make

少し待つ。こちらのmakeはそれほど時間はかからない。
makeが終ったら、CCLをフルビルドする。

$ cd ../../ → cclディレクトリへ
$ ./armcl
Welcome to Clozure Common Lisp Version 1.10-dev-r15791M  (LinuxARM32)!
? (ccl:rebuild-ccl :full t)

しばらく待つ。
完了したら (quit)。
上記ブログによると、Saving a CCL Application が便利のようだけど、今は不要。

Quicklispインストール

Quicklispをダウンロード。
curlが必要。

$ cd ~/opt
$ curl http://beta.quicklisp.org/quicklisp.lisp >quicklisp.lisp

Quicklispをインストール。

$ cd ccl
$ ./armcl
? (load "quicklisp.lisp")
? (quicklisp-quickstart:install)

初期化ファイル .ccl-init.lispで起動時にQuicklispを読み込むようにする。

? (ql:add-to-init-file)

これで完了。

Slimeインストール

Emacsからslimeを使えるようにする。

$ ./armcl

起動するまで少々時間がかかる。
(Quicklispのパッケージの依存関係でも調べているのだろうか?)

? (ql:quickload "quicklisp-slime-helper")

こんなパッケージがあったのかー!知らなかった。
ロードが完了したら、emacsの初期化ファイルに以下を書く。

(load (expand-file-name "~/quicklisp/slime-helper.el"))
(setq inferior-lisp-program "/home/pi/opt/ccl/armcl")
  → piユーザではない場合は変更。
(setq slime-net-coding-system 'utf-8-unix) ; ← 2013/4/7 追加

emacsを起動して、

M-x slime

でreplが起動する。
自分の環境では起動するまで50秒弱かかった。

swankサーバ

Emacsからいちいちslimeコマンドを実行して、cclを起動するよりも、
swankサーバを起動しておき、Emacsから接続する方が便利。
ccl-swank.lispを次の内容で作成しておく。

(ql:quickload :swank)
(swank:create-server :port 4005 :dont-close t)

./armcl -l ccl-swank.lisp
  → ccl-swank.lispの置き場所に応じてパスを変更。

しばらく待つと、サーバーが起動するので、
別ターミナルでemacsを起動する。

M-x slime-connect

ホストとポート番号を聞いてくる。
デフォルトのlocalhost、4005番でOK。
すぐにreplが起動する。

hunchentoot

replから
(ql:quickload :hunchentoot)
ロードが完了したら、サーバーを起動。
(hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242))
起動したら、ブラウザより http://localhost:4242 を開く。
Welcome画面が表示される。

以上の手順で、hunchentootが使えるようになった。
何を作ろうかなー?
ブラウザ経由でRaspberry PiのIOを使うようなものが面白いかな。