[ホーム]-> [cl]

Common Lisp

最初に

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

目次

  1. インストールした実装 (SBCL, CLisp, Clozure CL)
  2. 開発環境 (slime)
  3. asdf
  4. asdf-install
  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 というものがある。 パッケージシステムを定義するためのユーティリティみたいだが,これを入れておくと何かと便利。 また次に紹介する asdf-install を使うときにも利用できる。sbcl には初めから組込まれている。

asdf-install

asdf-install というものもある。これは,TeX で言えば CTAN, perl で言えば CPANみたいな仕組を提供してくれるもので,これを使うことでネットにあるライ ブラリを拾ってきてインストールしてくれる。

使い方

例えば cl-ppcre という Perl 互換 の正規表現ライブラリがある。これをインストールするには,sbcl を起動して

(require 'asdf)
(require 'asdf-install)
(asdf-install:install :cl-ppcre)
とすればよい。同様に cffi では,
(asdf-install:install :uffi)
とすればよい。この場合は,
CL> (asdf-install:install :uffi)
Install where?
1) System-wide install:
   System in /usr/local/lib/sbcl/site-systems/
   Files in /usr/local/lib/sbcl/site/
2) Personal installation:
   System in /home/matsu/.sbcl/systems/
   Files in /home/matsu/.sbcl/site/
のように表示される。2を選択すると,
Downloading 145878 bytes from http://files.b9.com/uffi/uffi-latest.tar.gz ...

debugger invoked on a ASDF-INSTALL::KEY-NOT-TRUSTED:
  GPG warns that the key id 0x112ECDF2C4A3823E (Kevin M. Rosenberg ) is not fully trusted

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

restarts (invokable by number or by possibly-abbreviated name):
  0: [CONTINUE      ] Install the package anyway
  1: [SKIP-GPG-CHECK] Don't check GPG signature for this package
  2: [ABORT         ] Exit debugger, returning to top level.

(ASDF-INSTALL::VERIFY-GPG-SIGNATURE/STRING
 "-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQBGo6vyES7N8sSjgj4RAqvEAJ9g1Gs0FExeDmAfqO0eqJjCbMfwCQCeI5PQ
a9tbqtLvu3mL9DEUKvjdW/A=
=lEcu
-----END PGP SIGNATURE-----
"
 #P"/home/matsu/UFFI.asdf-install-tmp")
0]
と出るので,1 を選択すれば,コンパイルしてインストールしてくれる。 ただし、今では uffi ではなく cffi をインストールすべきだろう。 ~/.sbclrc
(require 'asdf)
(require 'asdf-install)
と書いておけば,最初の2つは必要ない。

マニュアル類

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]