[ホーム]-> [cl]

Common Lisp

最初に

このページでは、主に Vine Linux 5.x ないしは 6.x での Common Lisp についての備忘録的な内容を書いています。

目次

  1. インストールした実装 (SBCL, CLisp, Clozure CL)
  2. 開発環境 (slime)
  3. asdf
  4. quicklisp
  5. マニュアル類
  6. readline (rlwrap)
  7. おまけ (Haskell)
  8. おまけ (prolog)

実装

Common Lisp にはいくつもの実装がある。ここでは私が使っている以下の3つについてのみ書く。(とはいうものの、mac でも sbcl がまともに動くようになってからは、ほとんど sbcl しか使っていない。)
  1. SBCL
  2. CLisp
  3. Clozure CL

slime

Common Lisp のプログラミングをするには,Emacs 上で slime を使うと便利。 プログラムを編集しながら,Emacs 内で common lisp を実行したりデバッグしたり, マニュアルを参照したりできる。 slime 自身は,簡単にコンパイル,インストールできる。

cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime
のように, cvs でソースを取ってきて, 中身を /usr/share/emacs/site-lisp/slime にでもコピーしておけば使えるようになる。(info ファイルなどは別途 make して, 適当なディレクトリにインストールする。) 私は Emacs の rpm は自作のものを使っているので, ここに src.rpm を置くのはやめておく。

slime 関係で書いた .emacs.el における記述は以下の通り。

(require 'hyperspec)
(setq common-lisp-hyperspec-root
      "file:/usr/share/doc/HyperSpec-7.0/HyperSpec/"
      common-lisp-hyperspec-symbol-table
      "/usr/share/doc/HyperSpec-7.0/HyperSpec/Data/Map_Sym.txt")

(require 'slime-autoloads)
(setq slime-lisp-implementations
      '((sbcl ("sbcl") :coding-system utf-8-unix)
	(clisp ("clisp") :coding-system euc-jp-unix)))

(setq slime-net-coding-system 'utf-8-unix)
(setq inferior-lisp-program "sbcl --noinform")
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(add-hook 'lisp-mode-hook (lambda ()
			    (slime-mode t)
			    ;(show-paren-mode)
			    (global-set-key "\C-cH" 'hyperspec-lookup)
			    (global-set-key "\C-cC" 'cltl2-lookup)))

(slime-setup '(slime-fancy))
(autoload 'cltl2-lookup "cltl2" "looking up cltl2 document" t)
(setq cltl2-root-url "file:///usr/share/doc/cltl2-2.0/cltl/")

;;; for skk
(defun skk-slime-space-insert (n)
  (interactive "p")
  (if skk-henkan-mode (skk-insert) (slime-space n)))
(add-hook 'slime-mode-hook
	  (lambda()
	    (define-key slime-mode-map " " 'skk-slime-space-insert)))
(add-hook 'slime-repl-mode-hook
	  (lambda()
	    (define-key slime-repl-mode-map " " 'skk-slime-space-insert)))

asdf

Common Lisp には ASDF というものがある。 パッケージシステムを定義するためのユーティリティみたいだが,これを入れておくと何かと便利。

quicklisp

quicklisp とは Commo Lisp 向けのライブラリ管理システム。かなり安定していて非常に便利。以前は asdf-install というものがあったが、少し不安定であったし、現在はもうメンテナンスされてはいない。

インストール

本家のサイトQuicklispから quicklisp.lisp というファイルをダウンロードする。次に、sbcl であれば

sbcl --load quicklisp.lisp
とするとか、処理系を起動してから (load "quicklisp.lisp") とするなどして このファイルを読み込む。そして
(quicklisp-quickstart:install)
を評価すればインストールされる。Linux ではホームディレクトリの下にquicklispというディレクトリができて、その下にいろいろなものがインストールされる。そして
(ql:add-to-init-file)
を実行すれば、起動時に読み込まれるファイルに初期設定を書込んでくれる。 私はquicklispというディレクトリ名を.quiclisp に変更した。その場合は、初期設定の部分を
#-quicklisp
(let ((quicklisp-init (merge-pathnames ".quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))
などと変更することになる。

使い方

ライブラリをインストールしたい場合、例えば hunchentoot を使いたいならば、
(ql:quickload :hunchentoot)
とすれば、依存するライブラリも含めてダウンロードしてインストールしてくれる。 Quicklisp は今のところ月一回くらいのペースでアップデートされているようで、
(ql:update-all-dists)
とすれば、自動でライブラリをアップデートしてくれる。また Quicklisp 自身の アップデートは
(ql:update-client)
とする。こちらの更新頻度はそれほど高くなさそう。またライブラリの検索は
(ql:system-apropos "ライブラリ名の一部")
とする。

マニュアル類

HyperSpec とは1994年における ANSI の Common Lisp 仕様書の html 版のこと。 また,その仕様を定めるプロセスの中で書かれた Common Lisp the Language 2nd Edition も,仕様書には書かれていない内容を含んでいて役に立つ。 hyperspec については slime から参照することができるし, cltl2 も Emacs から参照するための cltl2.el というものがある。

readline (rlwrap)

sbcl はそのままでは readline の機能が使えない。これでは不便なので, rlwrap をインストールする。

これを使えば, コマンドラインで $ rlwrap sbcl のようにして sbcl を起動することによって readline の機能が使える。 clisp は自前で readline が使えるので必要ない。


[ホーム]->[cl]