Next: Deferred Eval, Previous: Backquote, Up: Evaluation [Contents][Index]
フォームはほとんどの場合、実行されるプログラム内に出現することにより自動的に評価されます。ごく稀に実行時 —
たとえば編集されているテキストやプロパティーリストから取得したフォームを読み取った後 —
に計算されるようにフォームを評価するコードを記述する必要があるかもしれません。このようなときはeval
関数を使用します。eval
が不必要だったり、かわりに他の何かを使用すべきときがよくあります。たとえば変数から値を取得するにはeval
も機能しますが、symbol-value
のほうが適しています。eval
で評価するためにプロパティーリストに式を格納するかわりに、funcall
に渡すように関数を格納した方がよいでしょう。
このセクションで説明する関数と変数はフォームの評価、評価処理の制限の指定、最後にリターンされた値の記録を行なうものです。ファイルのロードでも評価が行なわれます(Loadingを参照)。
データ構造に式を格納して評価するより、データ構造に関数を格納してfuncall
やapply
で呼び出すほうが、より明解で柔軟です。関数を使用することにより、引数に情報を渡す能力が提供されます。
これは式を評価する基本的な関数である。この関数はカレント環境内でformを評価して、その結果をリターンする。formオブジェクトの型はそれが評価される方法を決定します。Formsを参照のこと。
引数lexicalは、ローカル変数にたいするスコープ規則(Variable Scopingを参照)を指定する。これが省略またはnil
ならデフォルトのダイナミックスコープ規則を使用してformを評価することを意味する。t
ならレキシカルスコープ規則が使用されることを意味する。lexicalの値にはレキシカルバインディングでの特定のレキシカル環境(lexical
environment)を指定する空ではないalistも指定できる。しかしこの機能はEmacs
Lispデバッガーのような、特別な用途にたいしてのみ有用。Lexical Bindingを参照のこと。
eval
は関数なのでeval
呼び出しに現れる引数式は2回 —
eval
が呼び出される前の準備で一度、eval
関数自身によりもう一度 — 評価される。以下に例を示す:
(setq foo 'bar) ⇒ bar
(setq bar 'baz) ⇒ baz ;;eval
が引数foo
を受け取る (eval 'foo) ⇒ bar ;;eval
が、foo
の値である、引数bar
を受け取る (eval foo) ⇒ baz
eval
で現在アクティブな呼び出しの数はmax-lisp-eval-depth
に制限される(以下参照)。
この関数はカレントバッファー内の、位置startとendで定義されるリージョン内のフォームを評価する。この関数はリージョンからフォームを読み取って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
をリターンする。
この関数はeval-region
と似ているが、引数は異なるオプション機能を提供する。eval-buffer
はバッファーbuffer-or-nameのアクセス可能な部分(Narrowing in The GNU Emacs
Manualを参照)の全体を処理する。buffer-or-nameにはバッファー名(文字列)を指定でき、nil
(または省略)のときはカレントバッファーを意味する。streamが非nil
、またはprintがnil
なら、eval-region
のようにstreamが使用される。この場合には式の評価結果の値は依然として破棄されるが、出力関数による出力はエコーエリアにプリントされる。filenameはload-history
(Unloadingを参照)に使用されるファイル名であり、デフォルトはbuffer-file-name
(Buffer File Nameを参照)。unibyteが非nil
ならread
可能な限りは文字列をユニコードに変換する。
eval-current-buffer
はこのコマンドのエイリアスである。
この変数はエラー(エラーメッセージは"Lisp nesting exceeds
max-lisp-eval-depth"
)がシグナルされる前にeval
、apply
、funcall
の呼び出しで許容される最大の深さを定義する。
制限を超過時のエラーを付随するこの制限は、誤って定義された関数による無限再帰をEmacs
Lispが回避する方法の1つである。max-lisp-eval-depth
の値を過大に増加させると、そのようなコードはかわりにスタックオーバーフローを起こすだろう。オーバーフローを処理できるシステムがいくつかある。この場合には通常のLisp評価は割り込まれて、制御はトップレベルのコマンドループ(top-level
)に戻される。この状況ではEmacs
Lispデバッガにエンターする手段は存在しないことに注意されたい。Error Debuggingを参照のこと。
Lisp式に記述された関数の呼び出し、関数呼び出しの引数と関数bodyフォームにたいする再帰評価、Lispコード内での明示的な呼び出し等では内部的にeval
、apply
、funcall
を使用して深さ制限を計数する。
この変数のデフォルト値は800。この値を100未満にセットした場合には、値が与えられた値に達するとLispはそれを100にリセットする。空きが少なければデバッガー自身を実行するために空きが必要になるので、Lispデバッガーに入ったときは値が増加される。
max-specpdl-size
はネストの他の制限を提供する。Local Variablesを参照のこと。
この変数の値は読み取り、評価、プリントを行なった標準的なEmacsコマンドにより、バッファー(ミニバッファーを含む)からリターンされる値のリストである(これには*ielm*バッファーでの評価や、lisp-interaction-mode
でのC-jやC-x
C-e、類似の評価コマンドを使用した評価は含まれないことに注意)。要素の順番はもっとも最近のものが最初になる。
(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