Previous: , Up: Evaluation   [Contents][Index]


9.5 Eval

ほとんどの場合、実行されるプログラム内に出現することにより、フォームは自動的に評価されます。稀に、実行時 — たとえば編集されているテキストや、プロパティーリストから取得したフォームを読み取った後 — に計算されるように、フォームを評価するコードを記述する必要があるかもしれません。このようなときは、eval関数を使用します。evalが不必要だったり、かわりに他の何かを使用すべきときが、しばしばあります。たとえば、変数から値を取得するには、evalも機能しますが、symbol-valueのほうが適しています。evalで評価するためにプロパティーリストに式を格納するより、かわりにfuncallに渡すように関数を格納した方がよいでしょう。

このセクションで説明する関数と変数は、フォームの評価、評価処理の制限の指定、最後にreturnされた値の記録を行なうものです。ファイルのロードでも評価が行なわれます(Loadingを参照してください)。

データ構造に式を格納してそれを評価するより、データ構造に関数を格納して、それをfuncallapplyで呼び出すほうが、より明解かつ柔軟です。関数を使用することにより、引数に情報を渡す能力が提供されます。

Function: eval form &optional lexical

これは、式を評価する、基本的な関数です。この関数は、カレント環境内でformを評価して、その結果をreturnします。formオブジェクトの型は、それが評価される方法を決定します。Formsを参照してください。

引数lexicalは、ローカル変数にたいするスコープ規則(Variable Scopingを参照してください)を指定します。これが省略されるかnilの場合、デフォルトのダイナミックスコープ規則を使用してformを評価することを意味します。tの場合は、レキシカルスコープ規則が使用されることを意味します。lexicalの値には、レキシカルバインディングにたいする特定のレキシカル環境(lexical environment)を指定する、空ではないalistも指定できます。しかし、この機能はEmacs Lispデバッガーのような、特別な目的にたいしてのみ有用です。Lexical Bindingを参照してください。

evalは関数なので、eval呼び出しに現れる引数式は2回 — 1度はevalが呼び出される前の準備、そしてeval関数自身によりもう1度 — 評価されます。以下は例です:

(setq foo 'bar)
     ⇒ bar
(setq bar 'baz)
     ⇒ baz
;; evalが引数fooを受け取る。
(eval 'foo)
     ⇒ bar
;; evalが、fooの値である、引数barを受け取る。
(eval foo)
     ⇒ baz

evalにより現在アクティブな呼び出しの数は、max-lisp-eval-depthに制限されます(以下参照)。

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

この関数は、カレントバッファー内の、位置startendで定義されるリージョン内のフォームを評価します。この関数はそのリージョンからフォームを読み取り、それらにたいしevalを呼び出します。これは、リージョンの最後に達するまで、または処理されないエラーがシグナルされるまで行なわれます。

デフォルトでは、eval-regionは何の出力も生成しません。しかし、streamが非nilの場合、出力関数(Output Functionsを参照してください)で生成された任意の出力、同様にリージョン内の式を評価した結果の値は、streamを使用してプリントされます。Output Streamsを参照してください。

read-functionが非nilの場合、readのかわりに1つずつ式を読み取るために使用する関数を指定します。これは、入力を読み取るストリームを指定する、1つの引数で呼び出される関数です。この関数を指定するために変数load-read-function(How Programs Do Loadingを参照してください)も使用できますが、引数read-functionを使用するほうが確実です。

eval-regionはポイントを移動しません。つねにnilをreturnします。

Command: eval-buffer &optional buffer-or-name stream filename unibyte print

この関数はeval-regionと似ていますが、引数は異なるオプション機能を提供します。eval-bufferは、バッファーbuffer-or-nameのアクセス可能な部分全体を処理します。buffer-or-nameにはバッファー名(文字列)を指定でき、nil(または省略)のときはカレントバッファーを意味します。streamnilかつprintが非nilでない場合、eval-regionのようにstreamが使用されます。この場合、式の評価による結果の値は依然として破棄されますが、出力関数による出力はエコーエリアにプリントされます。filenameは、load-history(Unloadingを参照してください)に使用されるファイル名で、デフォルトはbuffer-file-name(Buffer File Nameを参照してください)です。unibyteが非nilの場合、可能な限りreadは文字列をユニコードに変換します。

eval-current-bufferは、このコマンドのエイリアスです。

User Option: max-lisp-eval-depth

この変数は、エラー(エラーメッセージは"Lisp nesting exceeds max-lisp-eval-depth")がシグナルされる前に、evalapplyfuncallの呼び出しで許される最大の深さを定義します。

制限を超えたときのエラーをもつこの制限は、Emacs Lispで誤って定義された関数による無限再帰を避ける方法の1つです。max-lisp-eval-depthの値を過大に増加させた場合、そのようなコードはかわりにスタックオーバーフローを起こすでしょう。

たとえば、Lisp式に記述された関数の呼び出し、関数呼び出しの引数と、関数bodyフォームにたいする再帰評価、Lispコード内での明示的な呼び出しなどにたいして、深さ制限を数えるために、内部的にevalapplyfuncallを使用します。

この変数のデフォルト値は400です。この値を100未満にセットした場合、値が与えられた値に達すると、Lispはそれを100にリセットします。空きが少ない場合、デバッガー自身を実行するために空きが必要になるので、Lispデバッガーに入ったときは、この値が増加されます。

max-specpdl-sizeはネストの他の制限を提供します。Local Variablesを参照してください。

Variable: values

この変数の値は、読み取り、評価、プリントを行なった標準的なEmacsコマンドにより、バッファー(ミニバッファーを含む)からreturnされる値のリストです(これには*ielm*バッファーでの評価や、lisp-interaction-modeでのC-jを使用した評価は含まれないことに注意してください)。要素の順番は、もっとも最近のものが最初になります。

(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)
;; これは新たな要素をputするので、
;;   すべての要素が1つ後に移動する。
(nth 1 values)
     ⇒ (A 3 t)
;; これは次に新しい、この例の前の次に新しい要素を取得する。
(nth 3 values)
     ⇒ 1