3/09/2011

第2回 Quicklispによるライブラリ環境

 Common Lispのライブラリを利用するのに、以前はASDF-Installを使っていました。しかし、ASDF-Installは外部のシェルコマンドに依存するためWindowsでの利用が面倒だったり、接続先のサーバが落ちていてダウンロードできなかったり、ダウンロードできたとしてもビルドできないといったことが多くありました。

 これを解決するためにZach Beaneが開発したのがQuicklispです。現在BETA公開中で、いくつか制限事項はありますが、誰でも利用できるようになっています。

Quicklisp BETA

セットアップ

 まずはQuicklisp自身をインストールします。以下のリンクからQuicklispをダウンロードしてください。

 あなたのLisp処理系 (きっとSBCL以外でしょうね) を起動し、以下のコードを実行してください。

(load "quicklisp.lisp")
(quicklisp-quickstart:install :path ".quicklisp/")
(ql:add-to-init-file)

※注) もしプロキシを通す必要があれば:proxyキーワードにURLを文字列で渡してください。例: (quicklisp-quickstart:install :path ".quicklisp/" :proxy "http://192.168.xx.xx:8080")

 これでセットアップは完了です。~/quicklispというディレクトリができていることを確認してください。

 もしインストール後にQuicklispのディレクトリを変更したい場合には、~/quicklispディレクトリを移動したあと、処理系のinitファイル (Clozure CLならば~/.ccl-init.lisp)の一部を修正します。

;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames ".quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

ライブラリのインストール・ロード

 Quicklispでライブラリのインストールをするにはql:quickloadを使います。このコマンドは試験に出るのでよく覚えておいてください。

(ql:quickload :cl-ppcre)

 指定したライブラリがまだインストールされていなければ、サーバからダウンロードしてインストールします。ASDF-INSTALLと違って依存パッケージも同時にインストールしてくれるので非常に助かります。

ライブラリを探す

 Quicklispに登録されているライブラリを探すにはql:system-aproposを使います。

(ql:system-apropos "web")
;-> #<system cl-webdav / cl-webdav-0.2.0 / quicklisp 2011-02-19>
;   #<system hh-web-tags / hh-web-tags-20110219-hg / quicklisp 2011-02-19>
;   #<system hh-web-tags-tests / hh-web-tags-20110219-hg / quicklisp 2011-02-19>
;   #<system symbolicweb / symbolicweb-20101207-git / quicklisp 2011-02-19>
;   #<system symbolicweb-examples / symbolicweb-20101207-git / quicklisp 2011-02-19>
;   #<system symbolicweb-jquery / symbolicweb-20101207-git / quicklisp 2011-02-19>
;   #<system webactions / portableaserve-20101006-cvs / quicklisp 2011-02-19>
;   #<system weblocks / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-demo / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-demo-popover / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-elephant / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-elephant-demo / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-memory / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-postmodern / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-prevalence / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-s11 / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-scripts / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-store-test / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-yarek / weblocks-20110219-hg / quicklisp 2011-02-19>
;   #<system weblocks-yui / weblocks-20110219-hg / quicklisp 2011-02-19>
;=> nil

リポジトリをアップデートする

 Quicklispのリポジトリは毎月1回更新されます。ライブラリが更新されたり、追加されたり削除されたり。最新のライブラリにアップデートするには以下のコマンドを実行します。

(ql:update-all-dists)

ASDF2 - 登録されていないライブラリを使う

 Quicklispには既に多くのライブラリが登録されているとはいえ、まだ登録されていないライブラリもあります。また、自分が作ったライブラリやアプリケーションのロードには使うことができません。

 そこで、「ASDF2」を使ってローカルの指定のライブラリをロードできるようにします。ASDF2は多くの処理系で標準バンドルされているはずなので特にセットアップの必要はありません。

 まずはライブラリを置くディレクトリを作ります。ここでは~/.lisp/systemsにライブラリを置くものとします。

$ mkdir ~/.lisp/systems

 そして~/.config/common-lisp/source-registry.conf.d/01-add-local-lisp.confに上のディレクトリパスを指定します。

;; ~/.config/common-lisp/source-registry.conf.d/01-add-local-lisp.conf
(:tree (:home ".lisp/systems"))

 これで準備完了です。ASDF2は~/.lisp/systemsの中を再帰的に見て、その中のライブラリをロードできるようになりました

ライブラリのインストールと利用

 たとえばClackを使うには~/.lisp/systemsにソースをcloneします。

※追記(2011/04/11): 現在ではClackはQuicklispに取り込まれているため、インストールするためにこの処理は必要なくなっています。

$ cd ~/.lisp/systems
$ git clone git://github.com/fukamachi/clack
$ git clone git://github.com/arielnetworks/cl-annot

 Lisp処理系を立ち上げ、ql:quickloadしてください。

(ql:quickload :clack)

 これでClackが使えるはずです。以下のコードを実行して、http://localhost:5000/にアクセスしてみてください。"Hello, Clack!"と表示されるはずです。

(clack:clackup
  #'(lambda (req)
      (declare (ignore req))
      '(200 nil ("Hello, Clack!"))))

 使えなかった場合は@nitro_idiotに報告してくださいね。

まとめ

 今回はQuicklispとASDF2によるライブラリの導入について解説しました。PerlやRubyに比べるとそれほど良い環境とは言えませんが、以前と比べてLispのライブラリ環境も悪くなくなってきています。これから数もどんどん増えていくことでしょう。

 次回は松山さんがEmacsとSLIMEの環境設定について書いてくれるはずです。

3/07/2011

第1回 Common Lisp処理系のインストール

同僚の深町さんと「モダンCommon Lisp」シリーズを初めることになりました。今回はCommon Lisp処理系のインストール方法について解説します。

どの処理系を使うか

Common Lispには処理系が多数存在するため、プログラミングを初める前に、まずどの処理系を使うか決めなくてはなりません。商用ならAllegro CLでほぼ一択のようですが、お金がかかりますし、プロプライエタリソフトウェアですから、今回は候補から除外します。

無料で手に入る(フリーな)処理系としてはSBCLが有名です。多くのライブラリでサポートされている処理系であり、コンパイラの品質が高い(速いコードが生成される)という強みを持っていますが、スレッドサポートがかなり怪しいらしく(未確認)、またコンパイルに非常に時間がかかるという問題を持っています(開発のテンポに影響)。

SBCL以外には、例えばCLISPなどがありますが、今回は深町さんに教えてもらったClozure CLをおすすめしようと思います。

Clozure CLは、SBCLほどではないにしろ、多くライブラリでサポートされている処理系であり、また元々のサポートの対象であったDarwin系のOS以外にも、GNU/LinuxやFreeBSD、Solaris、Windowsに対応しています。深町さんはMac OS X 10.6で、僕はUbuntu 10.10でClozure CLを使っていますが、今までで致命的な問題になったことはないです。また、SBCLに比べて非常にコンパイルが速いのも重要な利点です。ただ、生成されるコードの品質はそれほど良くないので、開発時はClozure CL、運用時はSBCL、という使い分けが良いと思います。

Clozure CLをインストールする

※追記1: Clozure CLに加えて今後の連載で紹介するEmacs、SLIME、Quicklispもすべて含めたLispboxというプロダクトもあります。

※追記2: Macを使っていて、Homebrewを導入している人はbrew install clozure-clで最新のClozure CLをインストールできます。

現在での最新安定板はv1.7です。一応、次のURLから最新版を確認してください。

http://trac.clozure.com/ccl

ここではGNU/Linux x86_64にClozure CL v1.7をインストールする手順を説明します。Mac OS Xでもほぼ同じ手順でインストールできると思います。

まず~/optにリリースをダウンロードします。

$ mkdir -p ~/opt
$ cd ~/opt
$ # Mac OS Xならdarwinx86
$ # Linuxならlinuxx86
$ # 詳しくは上記URLを参照
$ svn co http://svn.clozure.com/publicsvn/openmcl/release/1.7/linuxx86/ccl

cclディレクトリが作られ、その中に32bit用と64bit用の実行可能ファイルが置かれます。なぜSubversionなのかというツッコミはやめましょう。

実行スクリプトはscriptsディレクトリの中にccl (64bit用はccl64) という名前で入っています。実行する際はCCL_DEFAULT_DIRECTORYに、checkoutしたcclディレクトリのパスを設定してください。

このスクリプトをPATH環境変数の通ったディレクトリにcclという名前で保存します。ここでは~/binに置きます。

$ cp scripts/ccl ~/bin/ccl
$ chmod +x ~/bin/ccl

最後にターミナルでcclを起動して、正しく動作すればOKです。

$ ccl
Welcome to Clozure Common Lisp Version 1.7-r14925M (LinuxX8632)! ?

次回はQuicklispのインストール方法について解説します。