Next: Parts of let Expression, Up: let [Contents][Index]
let Prevents Confusionスペシャルフォームletは混乱を防ぎます。letはlet式の外部で使用されるすべての同一名をシャドウする(覆い隠す)、ローカル変数(local
variable)の名前を作成します。これはあなたの友人が“家”と言う場合には、常にあなたの家ではなく友人の家のことを意味すると理解するようなものです(引数リスト内で使用されるシンボルが機能する方法も同様;
The defun Macroを参照)。
let式によって作成されたローカル変数は、そのlet式の内部(およびlet式内部で呼び出される式の中)にかぎりその値を保持します。このローカル変数はlet式の外部では効果をもたないのです。
letのことを、一時的かつローカルなsetqのようなものとみなすのも1つの考え方です。letによってセットされた値は、そのlet式の終了時に自動的に復元されます。この値のセットの効果はlet式のバインドの内部に限定されるのです。コンピューター科学における専門用語を用いると、letフォーム内でのシンボルのバインディングは、そのフォーム内で呼び出された関数内でのみ可視になると言えるでしょう。Emacs
Lispのデフォルトスコープはレキシカル(静的)ではなくダイナミック(動的)なのです(このマニュアルではデフォルトではないレキシカルバインディングについて議論しません)。
letで一度に複数の変数を作成できます。更にletが作成するそれぞれの変数にたいして指定した値、あるいはnilを初期値として与えることができます(専門用語では変数から値へのバインディングという)。letは値の作成とバインドを行った後に、letのbody内のコードを実行して、そのbody内の最後の式の値をlet式全体の値としてリターンします。(“実行(execute)”とはリストの評価を意味する専門用語であり、“to
give practical effect to”(Oxford English
Dictionary)、つまり実際の効果を与えるという意味に用いられる単語が由来です。何らかのアクションを行うために式を評価することから、“実行(execute)”は評価(evaluate)の同義語として進化しました。)