let 混乱を防ぐ ¶let という特殊形式は、混同を防ぎます。let
は ローカル変数 の名前を作成し、let
式の外側で同名のものが使われた場合にそれを上書きします(コンピュータサイエンスの専門用語では、これを変数の 束縛
と呼びます)。これは、ホストの家で彼が「家」と言うとき、それはあなたの家ではなく彼自身の家を指しているのだと理解するようなものです。(関数の引数に名前を付けるために使用される記号も、まったく同様にローカル変数として束縛されます。defun マクロ
を参照してください。)
let
を別の捉え方で考えると、それはコード内に特別な領域を定義していると言えます。つまり、let
式の本体内では、名前を付けた変数は独自のローカルな意味を持ちます。一方、let
本体の外では、それらは別の意味を持つ(あるいは全く定義されていない)ことになります。これは、let
本体内において、let 式で名前を付けた変数に対して setq を呼び出すと、その名前の ローカル
変数の値が設定されることを意味します。しかし、let
本体の外(別の場所で定義された関数を呼び出す場合など)では、let 式で名前を付けた変数に対して
setq を呼び出しても、そのローカル変数には 影響しません。9
let では、一度に複数の変数を作成できます。また、let は作成する各変数に、ユーザーが指定した値または nil のいずれかの初期値を割り当てます。(専門用語では、これを変数を値にバインドすると言います。)let が変数を作成してバインドした後、let
の本体内のコードを実行し、本体内の最後の式の値を let
式全体の値として返します。(「Execute」はリストを評価することを意味する専門用語で、「実際に効力を持たせる」という意味の言葉(Oxford English
Dictionary)に由来しています。動作を実行するために式を評価することから、「execute」は「evaluate」の類義語として定着しました。)