多くの場合、フォームは実行中のプログラム内に存在することで、自動的に評価されます。まれに、編集中のテキストからフォームを読み込んだり、プロパティリストから取得したりするなど、実行時に計算されるフォームを評価するコードを記述する必要がある場合があります。そのような場合には、eval 関数を使用してください。多くの場合、eval
は不要であり、代わりに別の方法を用いるべきです。例えば、変数の値を取得する場合、eval
でも動作しますが、symbol-value
の方が好ましいです。あるいは、式をプロパティリストに格納して eval
を通すのではなく、代わりに関数を格納して funcall に渡す方が適切です。
本節で説明する関数や変数は、フォームを評価したり、評価処理の制限を指定したり、あるいは直近に返された値を記録したりします。ファイルの読み込み時にも評価が行われます(読み込みを参照)。
データ構造に式を格納して評価するよりも、関数をデータ構造に格納し、funcall や apply
で呼び出す方が、一般的に簡潔で柔軟です。関数を用いることで、情報を引数として渡すことが可能になります。
これは式を評価するための基本機能です。現在の環境で form を評価し、その結果を返します。form オブジェクトの型によって、評価方法が決まります。フォームの種類を参照してください。
引数 lexical は、ローカル変数のスコープ規則を指定します(変数束縛のスコープ規則を参照)。t
の場合は、レキシカルスコープを用いて form
を評価することを意味し、これが推奨される値です。省略されているか nil
の場合は、従来の動的スコープのみの変数スコープ規則を使用することを意味します。
lexical の値には、字句束縛のための特定の 字句環境 を指定する空でないリストを用いることもできますが、この機能は Emacs Lisp デバッガなどの特殊な用途においてのみ有用です。リストの各要素は、字句シンボルと値のペアを表すコンスセルか、あるいは束縛された場合に動的スコープが適用される(特殊な)変数を表すシンボルのいずれかです。
eval は関数であるため、eval
の呼び出しに現れる引数式は、eval が呼び出される前の準備として一度、そして eval 関数自身によってもう一度、計2回評価されます。以下に例を示します。
(setq foo 'bar)
⇒ bar
(setq bar 'baz)
⇒ baz
;; Here eval receives argument foo
(eval 'foo)
⇒ bar
;; Here eval receives argument bar, which is the value of foo
(eval foo)
⇒ baz
eval への現在アクティブな呼数は、max-lisp-eval-depth に制限されています(以下参照)。
この関数は、位置 start と end
で定義される領域内の現在のバッファにあるフォームを評価します。当該領域からフォームを読み込み、領域の終端に達するか、あるいはエラーがシグナルされ処理されない限り、それらに対して
eval を呼び出します。
デフォルトでは、eval-region は何も出力しません。ただし、stream が nil 以外の場合、出力関数(出力関数
を参照)によって生成される出力や、リージョン内の式の評価結果は、stream を用いて出力されます。出力ストリーム を参照してください。
read-function が nil
でない場合、それは関数である必要があり、read
の代わりに用いられて式を一つずつ読み出します。この関数は、入力を読み出すためのストリームを1つの引数として呼び出されます。また、変数 load-read-function(プログラムによる読み込みの仕組み
を参照)を使用してこの関数を指定することもできますが、read-function
引数を使用する方がより堅牢です。
eval-region はポイントを移動しません。常に nil を返します。
これは eval-region
と同様ですが、引数によって提供されるオプション機能が異なります。eval-buffer はバッファ
buffer-or-name のアクセス可能な全領域に対して動作します(The GNU Emacs Manual の Narrowing
を参照)。buffer-or-name にはバッファ、バッファ名(文字列)、または nil(あるいは省略)を指定でき、後者は現在のバッファを使用することを意味します。stream は eval-region
と同様に使用されますが、stream が nil かつ
print が nil
以外の場合は除きます。その場合、式の評価結果は引き続き破棄されますが、出力関数の出力はエコーエリアに表示されます。filename は load-history
で使用するファイル名であり(Unloading
を参照)、デフォルトは buffer-file-name です(Buffer File Name を参照)。unibyte が nil 以外の場合、read は可能な限り文字列をユニバイトに変換します。
この変数は、エラーが通知される(エラーメッセージ "Lisp nesting exceeds
max-lisp-eval-depth" を伴う)までに、eval、apply、および funcall の呼び出しで許容される最大深度を定義します。
この制限と、それを超えた際に生じるエラーにより、Emacs Lispでは定義が不十分な関数による無限再帰を回避しています。max-lisp-eval-depth
の値を大きくしすぎると、代わりにこのようなコードがスタックオーバーフローを引き起こす可能性があります。システムによっては、このオーバーフローを処理できる場合があります。その場合、通常のLisp評価は中断され、制御は最上位のコマンドループ(top-level)に戻されます。なお、この状況でEmacs Lispデバッガに入る方法はありません。エラー発生時のデバッガ起動を参照してください。
深度制限には、Lisp式で言及されている関数の呼び出しや、関数呼び出しの引数および関数本体形式の再帰的評価、ならびにLispコード内での明示的な呼び出しなど、eval、apply、funcallの内部的な使用も含まれます。
この変数のデフォルト値は1600です。100未満の値を設定した場合、指定された値に達するとLispはそれを100にリセットします。
無限再帰エラーをデバッグできるように、Lispデバッガを呼び出す際、Emacsは空き領域が少ない場合にmax-lisp-eval-depthの値を一時的に増加させ、デバッガ自体が実行するための領域を確保します。handler-bindのハンドラを実行する場合も同様です。エラー処理コードの書き方を参照してください。
変数 lisp-eval-depth-reserve は、そうした例外的な状況において Emacs
が max-lisp-eval-depth に付加できる追加の深さを制限します。
この変数のデフォルト値は200です。
この変数の値は、これを行う標準的なEmacsコマンドによって、バッファ(ミニバッファを含む)から読み込まれ、評価され、出力されたすべての式が返した値のリストです。(なお、これには*ielm*バッファ内での評価や、lisp-interaction-mode内でのC-j、C-x C-eおよび同様の評価コマンドを用いた評価は含まれません。)
この変数は廃止されており、Emacsプロセスのメモリ使用量を絶えず増大させるため、今後のバージョンで削除される予定です。そのため、使用しないことを推奨します。
values の要素は、最新のものから順に並びます。
(setq x 1)
⇒ 1
(list 'A (1+ 2) auto-save-default)
⇒ (A 3 t)
values
⇒ ((A 3 t) 1 ...)
この変数は、最近評価されたフォームの値を参照する際に役立つ場合があります。values
自体の値を出力するのは、非常に長くなる可能性があるため、一般的には避けたほうがよいでしょう。代わりに、次のように特定の要素を確認してください。
;; Refer to the most recent evaluation result.
(nth 0 values)
⇒ (A 3 t)
;; That put a new element on, ;; so all elements move back one. (nth 1 values) ⇒ (A 3 t)
;; This gets the element that was next-to-most-recent ;; before this example. (nth 3 values) ⇒ 1