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)の同義語として進化しました。)