Previous: Quoting, Up: Evaluation


8.4 評価(eval)

ほとんどの場合、実行中のプログラムにフォームが現れると フォームは自動的に評価されます。 稀なことですが、実行時に計算したフォームを評価するように コードを書く必要があるかもしれません。 たとえば、編集中のテキストからフォームを読み取ったり、 属性リストからフォームを取り出した場合などです。 このような場合には、関数evalを使います。

本節で説明した関数や変数は、フォームを評価したり、 評価処理に制限を課したり、最後の戻り値を記録したりします。 ファイルをロードしても評価が行われます(see Loading)。

注意: データ構造の中に関数を格納して それをfuncallapplyで呼び出すほうが、 データ構造の中に式を格納してそれを評価するより、 一般に明確で柔軟性があります。 関数を使うとそれらに引数として情報を渡すことができます。

— Function: eval form

この関数は、式を評価する基本的な関数である。 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(下記参照)に制限される。

— コマンド: eval-region start end &optional stream read-function

この関数は、カレントバッファのstartendで指定した リージョン内のフォーム群を評価する。 リージョンからフォームを読み取り、 それらに対してevalを呼び出すことを リージョンの末尾に達するまで、あるいは、処理されないエラーが通知されるまで 繰り返す。

streamnil以外ならば、 リージョン内の式を評価した結果の値はstreamを使って表示する。 see Output Streams

read-functionnil以外にならば、 それは関数である必要があり、 readのかわりに式を1つ1つ読むために使われる。 この関数は、入力用のストリームである1つの引数で呼び出される。 変数load-read-function(see How Programs Do Loading)を 使ってこの関数を指定することもできるが、 引数read-functionを用いたほうが堅牢である。

eval-regionはつねにnilを返す。

— コマンド: eval-current-buffer &optional stream

これはeval-regionと同様だが、バッファ全体に作用する。

— Variable: max-lisp-eval-depth

この変数は、 (エラーメッセージ"Lisp nesting exceeds max-lisp-eval-depth"で) エラーを通知までのevalapplyfuncallの呼び出しの 最大の深さを制限する。 この制限、および、これを超えたときのエラーは、 不正に定義された関数によってLispが無限に再帰することを防止する 1つの方法である。 深さ制限は、Lispコードによる明示的な呼び出しに加えて、 Lisp式で書かれた関数の呼び出しや関数呼び出しの引数や関数本体のフォームの 再帰的な評価などの内部的なevalapplyfuncallの 呼び出しも数える。

この変数のデフォルト値は300。 これに100未満の値を設定すると、指定した値に達するとLispは100に設定し直す。 Lispデバッガに入ったとき、 制限に近い場合にはデバッガ自身が実行できることを保証するために値を増やす。

max-specpdl-sizeは、入れ子の深さを制限する別の方法である。 see Local Variables

— Variable: values

この変数の値は、 バッファから式を読み取り、評価し、結果を表示する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