Emacs Lisp

記号数式処理は実は単なるパターンの置き換えである。 よって、次の章で説明する内挿表現を処理するためには List で表現された パターンを置きかえればいいだけである。 Lisp (List Processor) 言語はそのような機能をもつ十分な言語なので、 これからはプログラミング言語として Lisp を用いることにする。

Lisp 言語にもいろいろな方言があり、それらの方言をなくそうとして標準規格 の Common Lisp というのがあるが、本稿ではそれのほぼ上位互換の Emacs Lisp を使うことにする。Gnu の Emacs/Nemacs/Mule 系のエディタは多くの人が使っており、 UNIX, Windows などのプラットフォームに依らず使えるので好都合だと思う。

Mule で (Emacs) Lisp コードを実行する

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) に辿りつく。

Lisp の基礎

リスト・コンスセル・アトム

リストは、空リストを示す特別なシンボル nil か、 1つ以上のコンスセル(cons cell)をリンクしたもの。 Lisp のコンスセルは、2 つのポインタ car ポインタと cdr ポインタを 持つデータオブジェクト。 そして、コンスセルを辿っていくといつかそれ以上分解できない アトム(atom) に辿りつく。アトムは文字列とか数値の記号である。

リスト・コンスセル・アトム

図1: リスト・コンスセル・アトム

[list] := ([cons cell]*) | nil
[cons cell] := (car→, cdr→)

連想リスト (association list) (略:A リスト)

コンスセルのリストで、各サブリストの car がキーで cdr がそれに対応する値。

例えば、シンボル A に値 1、値 5 にリスト (2)、が対応する A リストは次のようになる。

((A . 1) (5 2))

アトムの種類

atom は日本語訳すると原子であるが、原子のようにそれ以上分解できない 数値、文字のことである。

階乗を再帰的に計算するプログラムの例

;; 階乗の関数 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


Go back