Common Lisp:在函数中使用未定义的变量

por*_*y11 0 lisp common-lisp

我想在Common Lisp中做类似的事情:

(defparameter *fun* 
  (lambda () x))

(let ((x 0))
  (funcall *fun*)) ;should return 0
Run Code Online (Sandbox Code Playgroud)

我想在定义函数时访问未定义的函数中的本地绑定.

如果我使用x作为参数,它会工作,但我无法更改变量的值:

(defparameter *fun* 
  (lambda (x) (setf x (+ x 1))))

(let ((x 0))
  (funcall *fun* x)) ;should return 1, would return 0
Run Code Online (Sandbox Code Playgroud)

我怎么能做我想做的事?

m-n*_*m-n 6

您可以在绑定站点和引用站点声明变量special(dynamic):

(defparameter *fun* 
  (lambda () (declare (special x)) x))

(let ((x 0))
  (declare (special x))
  (funcall *fun*))
Run Code Online (Sandbox Code Playgroud)

或全球:

(defvar *x*)  ;; makes *x* special

(defparameter *fun* 
  (lambda () *x*))

(let ((*x* 0))
  (funcall *fun*))
Run Code Online (Sandbox Code Playgroud)

晚编辑:

在这种情况下,宏可能会更好地为您服务.函数可以访问的唯一词法绑定是在创建时存在的那些.例如,您描述的行为由宏incf中的标准给出.Define-modify-macro是一个帮助器,用于定义类似于incf的宏.http://www.lispworks.com/documentation/HyperSpec/Body/m_defi_2.htm