let
(let ((var init)...) body...)
ローカル変数の束縛を確立します。各 init は(周囲のスコープで)評価され、body の実行中はそれぞれの var に束縛されます。そのため束縛は逐次的ではなく並列です。body のフォームは順に評価され、最後のフォームの値が返されます。本体が空の場合、結果は nil です。束縛は変数の束縛のみで、Lisp-2 に従い関数名前空間を覆い隠すことはありません。したがって let で束縛された car は関数 car の呼び出しに影響しません。
var が スペシャル として宣言された変数(defvar/defparameter または (declaim (special ...)) による)を指す場合、または body の先頭の (declare (special var)) がその名前を指す場合、その束縛は ダイナミック です。すなわち body 中に呼ばれた任意の関数からも見え(レキシカルにネストしたコードだけではなく)、body の脱出時に復元されます。スペシャル変数の参照は、クロージャの中でもそれ以外でも、実行した時点で有効な束縛を読みます。したがって body で作ったクロージャを let の脱出後に呼ぶと、グローバルな値を読みます。どの init も変数の束縛より前に評価されます。そのため、スペシャル変数を読む関数を init で呼ぶと、この let が確立する束縛ではなく外側の束縛を読みます。スペシャルでない通常の名前は従来どおりレキシカルに束縛されます。ほかの場所のローカル宣言だけがスペシャルにしている名前も同じです。ローカル宣言が及ぶのは、その宣言自身の束縛と本体の中の参照だけです(declare)。実行時に計算されるスペシャル束縛のリストについては progv も参照してください。