それが実際に行うことは、ANSI Common Lisp 標準では規定されていません。
一般に、動的にバインドされた値またはグローバル値を設定するだけの CL 実装を好みます。他に何もすべきではありません。デフォルトでは、CMUCL はシンボルを special と宣言するのが良い考えだと考えていたようです。しかし、グローバルな特殊宣言を取り除く明白な方法がなかったので、それは悪い考えでした。
したがって、通常は次のようなものを期待します (ここでは LispWorks):
CL-USER 66 > (defun foo () (setf x44 10))
FOO
グローバル変数はまだバインドされていません。
CL-USER 67 > x44
Error: The variable X44 is unbound.
1 (continue) Try evaluating X44 again.
2 Specify a value to use this time instead of evaluating X44.
3 Specify a value to set X44 to.
4 (abort) Return to level 0.
5 Return to top loop level 0.
Type :b for backtrace or :c <option number> to proceed.
Type :bug-form "<subject>" for a bug report template or :? for other options.
CL-USER 68 : 1 > :top
関数を呼び出しましょう:
CL-USER 69 > (foo)
10
これでグローバルな値になりました:
CL-USER 70 > x44
10
ただし、変数は特別であると宣言されていません ( DEFVAR
orによるようにDEFPARAMETER
)。ここで字句バインディングが確立されます。
CL-USER 71 > (let ((x44 20)) (foo) x44)
20
ローカル変数を特別なものとして宣言すると、関数はバインドを変更します。
CL-USER 72 > (let ((x44 20)) (declare (special x44)) (foo) x44)
10