Lispでの変数は、大きく分けて3種類あります。定数変数defconstantで定義でき、再代入も再バインドもできません。「本物の」定数(数学的な定数など)に使います。逆に言うと、それ以外の場合にはあまり使う機会は少ないでしょう。慣例により、定数変数名の前後に+を付けることが多いです。ERRORスペシャル変数(ダイナミック変数)スペシャル変数(またはダイナミック変数)は、他の言語でいうところのグローバル変数に相当します(ただし、いくつか特長があります)。スペシャル変数は、慣例により名前の前後に*を付けて表され、setfによる代入が可能です。初期値なしでもスペシャル変数を定義でき、初期値を指定した場合は、その変数が未定義だった場合のみ初期値を代入します。defparameterは、初期値を必ず指定する必要があり、すでにその変数に値が存在するかどうかにかかわらず初期値を設定します。形式を用いて実行時に再束縛することができます。終了すると、再び以前の値に戻ります。(実行時に決定されることが、「ダイナミック変数」と呼ばれる理由です)。詳細は、HyperSpecのletの例を参照して下さい。形式を使って、ローカルに使う変数を定義できます。他の言語でのローカル変数に相当します。形式でバインドされた値が使用されます。スコープはレキシカルになります。メモリの解法はGCが行っているのだと考えていいでしょう。賢いコンパイラはスタック上にメモリを配置します。上の例は、実はレキシカル変数でなくてもダイナミック変数でも動きます。下の例はレキシカル変数でなくてはなりません。行われているのと同様だと考えてみればいいのではないでしょうか。Lispにトップレベルのレキシカル変数はありませんが、動作を模倣することは可能です。