Lisp 言語にもいろいろな方言があり、それらの方言をなくそうとして標準規格 の Common Lisp というのがあるが、本稿ではそれのほぼ上位互換の Emacs Lisp を使うことにする。Gnu の Emacs/Nemacs/Mule 系のエディタは多くの人が使っており、 UNIX, Windows などのプラットフォームに依らず使えるので好都合だと思う。
C-x C-e, eval-last-sexp
Emacs Lisp の式の直後にカーソルを置いてこのコマンドを実行すると、
カーソルの直前にある式を実行し、その値を表示する。
eval-current-buffer
現在のバッファ全体を Emacs Lisp のプログラムと見なして実行する。
eval-region
領域を Emacs Lisp のプログラムと見なして実行する。
リストは、空リストを示す特別なシンボル nil か、
1つ以上のコンスセル(cons cell)をリンクしたもの。
Lisp のコンスセルは、2 つのポインタ car ポインタと cdr ポインタを
持つデータオブジェクト。
そして、コンスセルを辿っていくといつかそれ以上分解できない
アトム(atom) に辿りつく。
図1: リスト・コンスセル・アトム
[list] := ([cons cell]*) | nil [cons cell] := (car→, cdr→)
例えば、シンボル A に値 1、値 5 にリスト (2)、が対応する A リストは次のようになる。
((A . 1) (5 2))
;; 階乗の関数 fact の再帰的定義 (defun fact(n) (if (eq n 0) ;---- true ---- 1 ;---- false ---- (* n (fact (1- n))) ) ) ;; 5! を計算する (fact 5)
参考ページ: http://flex.ee.uec.ac.jp/texi/eljman/eljman_toc.html