GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Intro-Eval.html ・ emacs-doc.conao3.com

10.1 評価入門

Lispインタプリタ(またはエバリュエータ)は、与えられた式の値を計算するEmacsのコンポーネントです。Lispで記述された関数が呼び出されると、エバリュエータは関数本体内の式を評価することで、その関数の値を計算します。したがって、任意のLispプログラムを実行するということは、実質的にLispインタプリタを実行することを意味します。

評価対象となるLispオブジェクトは、フォームまたは式と呼ばれる8。フォームが単なるテキストではなくデータオブジェクトであるという点は、Lisp系言語と一般的なプログラミング言語との根本的な違いの一つである。あらゆるオブジェクトは評価可能だが、実際には非常に頻繁に評価されるのは数値、シンボル、リスト、および文字列のみである。

以降の節では、それぞれの形式において評価が何を意味するのか、その詳細について説明します。

Lispのフォームを読み込んでから評価するという流れは非常に一般的ですが、読み込みと評価は別々の操作であり、どちらか一方のみを行うことも可能です。読み込みそれ自体では何も評価されず、Lispオブジェクトの印刷表現をオブジェクトそのものに変換します。このオブジェクトが評価対象のフォームなのか、あるいは全く別の目的を持つものなのかを指定するのは、readの呼び出し側の役割です。入力関数を参照してください。

評価は再帰的なプロセスであり、フォームを評価する際には、多くの場合そのフォーム内の各部分を評価することになります。例えば、(car x) のような 関数呼び出し フォームを評価する場合、Emacs はまず引数(サブフォーム x)を評価します。引数の評価後、Emacs は関数(car)を 実行 します。関数が Lisp で記述されている場合、実行は関数の 本体 を評価することで行われます(ただし、この例では car は Lisp 関数ではなく、C で実装されたプリミティブ関数です)。関数および関数呼び出しの詳細については、関数 を参照してください。

評価は環境と呼ばれるコンテキストで行われ、そこにはすべてのLisp変数の現在の値と束縛が含まれます(変数を参照)。9 フォームが変数を参照する際に新しい束縛を作成しない場合、その変数は現在の環境によって与えられる値として評価されます。また、フォームの評価によって変数が束縛され、環境が一時的に変更されることもあります(ローカル変数を参照)。

フォームを評価すると、永続的な変更が生じることがあります。こうした変更は副作用と呼ばれます。副作用を引き起こすフォームの例として、(setq foo 1)が挙げられます。

評価とコマンドキーの解釈を混同しないでください。エディタのコマンドループは、アクティブなキーマップを用いてキーボード入力をコマンド(対話的に呼び出し可能な関数)に変換し、その後 call-interactively を使用してそのコマンドを実行します。コマンドがLispで記述されている場合、その実行には通常評価が伴いますが、このステップはコマンドキーの解釈の一部とはみなされません。コマンドループを参照してください。


脚注

(8)

S式やsexpと呼ばれることもありますが、本マニュアルでは通常この用語は使用しません。

(9)

この「環境」の定義は、特に、プログラムの結果に影響を及ぼし得るすべてのデータを含めることを意図したものではありません。