2012年4月6日金曜日

Emacs Lisp で式を評価する

1. 式を評価する

C-j : 評価した結果を挿入

Emacs を起動すると、*scratch* バッファが存在する。

*scratch* バッファで Emacs Lisp の式を書き、

(* (+ 1 2) 3)

閉じた括弧の後ろにポイントを置いて、

C-j

を入力すると、

(* (+ 1 2) 3)
9

括弧で囲まれた式が評価され、その結果が挿入される。

内側の閉じた括弧の後ろで C-j を入力すると、

(* (+ 1 2)
3
 3)

その場所に結果が挿入される。

C-j に割り当てられたコマンドは、

eval-print-last-sexp

Evaluate sexp before point; print value into current buffer.

 

C-x C-e : 結果をミニバッファに表示

先ほどの例において、C-j の代わりに、

C-x C-e

を入力すると、ミニバッファに評価された結果が表示される。

eval-last-sexp

Evaluate sexp before point; print value in minibuffer.

 

eval-region: 指定した範囲を評価

指定した範囲の式を評価したい場合は、

M-x eval-region

Eval - GNU Emacs Lisp Reference Manual によると、

— Command: eval-region start end &optional stream read-function

This function evaluates the forms in the current buffer in the region defined by the positions start and end.

上記のコマンドは、全て

eval-

で始まる。式を評価するためのキー入力を忘れたら、eval だけ思い出せば良い。

 

2. 括弧の閉じ忘れを探す

eval-region を利用すると、括弧の閉じ忘れを見つけることができる。

例えば、以下の式を eval-region で評価する。

(setq x 7)
(defun g () x)
(defun f ()
  (let ((x 9))
    (g))
(message "%d" (f))
(message "%d" x)

評価した結果、

End of file during parsing

Debugging your ~/.emacs and Elisp によると、

Error in init file: End of file during parsing
などと言われた時は ~/.emacs のかっこが正しく閉じていない。 Mark, eval-region を使ってどこがおかしいか調べて場所を限定して行く。調べる範囲の開始点で Mark( C-space ) 終了点で、M-x eval-region とすれば、その範囲がおかしい時には End of file during parsingと言われるはず。

また、別の方法として、対応する括弧へとポイントが移動する

C-M-f

を入力すると、閉じ忘れた括弧で、

Scan error

と表示される。

C-M-f に割り当てられたコマンドは、

forward-sexp

Move forward across one balanced expression (sexp).