1、不用defvar 与defparameter 创建的变量,不支持动态绑定。
(psetq x nil)
(defun print-x nil (format t "x=~a~%" x))
test:
(print-x); nil
(let ((x 123)) (print-x));nil
2、在 第 1 步的基础上执行 (defvar x nil) 后,变量变为支持动态绑定.
(defvar x nil)
(print-x);nil
(let ((x 123)) (print-x));123
3、删除变量x地定义后,print-x 中对 x 的引用变为 #:x.
(unintern (find-symbol "X")); T
(symbol-function 'print-x); #<FUNCTION PRINT-X NIL (DECLARE (IN-DEFUN PRINT-X)) (BLOCK PRINT-X (FORMAT T x=~a~% #:X))>
(let ((x 123)) (print-x));NIL :因为动态绑定的 x 与#:x不为同一变量( package 不同)
综上:
1、需要动态绑定的变量用defvar 或 defparameter 创建.
2、unintern 的变量相关的函数需要重建.