ほとんどの場合、実行中のプログラムにフォームが現れると
フォームは自動的に評価されます。
稀なことですが、実行時に計算したフォームを評価するように
コードを書く必要があるかもしれません。
たとえば、編集中のテキストからフォームを読み取ったり、
属性リストからフォームを取り出した場合などです。
このような場合には、関数eval
を使います。
本節で説明した関数や変数は、フォームを評価したり、 評価処理に制限を課したり、最後の戻り値を記録したりします。 ファイルをロードしても評価が行われます(see Loading)。
注意:
データ構造の中に関数を格納して
それをfuncall
やapply
で呼び出すほうが、
データ構造の中に式を格納してそれを評価するより、
一般に明確で柔軟性があります。
関数を使うとそれらに引数として情報を渡すことができます。
この関数は、式を評価する基本的な関数である。 formを現在の環境において評価し、その結果を返す。 評価処理はオブジェクトの型に依存する(see Forms)。
eval
は関数なので、eval
の呼び出しに現れる 引数の式は2度評価される。eval
を呼び出すまえの準備で1回、 関数eval
自身による評価でもう1回である。 例を示す。(setq foo 'bar) ⇒ bar (setq bar 'baz) ⇒ baz ;;eval
は引数foo
を受け取る (eval 'foo) ⇒ bar ;;eval
は引数bar
を受け取る。それはfoo
の値 (eval foo) ⇒ baz
eval
の呼び出しの深さは、max-lisp-eval-depth
(下記参照)に制限される。
この関数は、カレントバッファのstartとendで指定した リージョン内のフォーム群を評価する。 リージョンからフォームを読み取り、 それらに対して
eval
を呼び出すことを リージョンの末尾に達するまで、あるいは、処理されないエラーが通知されるまで 繰り返す。streamが
nil
以外ならば、 リージョン内の式を評価した結果の値はstreamを使って表示する。 see Output Streams。read-functionが
nil
以外にならば、 それは関数である必要があり、read
のかわりに式を1つ1つ読むために使われる。 この関数は、入力用のストリームである1つの引数で呼び出される。 変数load-read-function
(see How Programs Do Loading)を 使ってこの関数を指定することもできるが、 引数read-functionを用いたほうが堅牢である。
eval-region
はつねにnil
を返す。
この変数は、 (エラーメッセージ
"Lisp nesting exceeds max-lisp-eval-depth"
で) エラーを通知までのeval
、apply
、funcall
の呼び出しの 最大の深さを制限する。 この制限、および、これを超えたときのエラーは、 不正に定義された関数によってLispが無限に再帰することを防止する 1つの方法である。 深さ制限は、Lispコードによる明示的な呼び出しに加えて、 Lisp式で書かれた関数の呼び出しや関数呼び出しの引数や関数本体のフォームの 再帰的な評価などの内部的なeval
、apply
、funcall
の 呼び出しも数える。この変数のデフォルト値は300。 これに100未満の値を設定すると、指定した値に達するとLispは100に設定し直す。 Lispデバッガに入ったとき、 制限に近い場合にはデバッガ自身が実行できることを保証するために値を増やす。
max-specpdl-size
は、入れ子の深さを制限する別の方法である。 see Local Variables。
この変数の値は、 バッファから式を読み取り、評価し、結果を表示するEmacsの標準コマンドが行った すべての式の戻り値のリストである。 リストの順序は、最新のものが最初にくる。
(setq x 1) ⇒ 1 (list 'A (1+ 2) auto-save-default) ⇒ (A 3 t) values ⇒ ((A 3 t) 1 ...)この変数は、最近評価したフォームの値を参照するのに便利である。
values
そのものの値の表示は非常に長くなる可能性があるので、 その値を表示するのはよくない。 そのかわりに、つぎのようにして特定の要素を調べる。;; もっとも最近の評価結果を参照する (nth 0 values) ⇒ (A 3 t) ;; こうすると、新たな要素が追加され、 ;; すべての要素が1つうしろへさがる (nth 1 values) ⇒ (A 3 t) ;; この例を実行するまえの最新のもののつぎの要素を取得する (nth 3 values) ⇒ 1