我想在 Common Lisp 中做类似的事情:
(defparameter *fun*
(lambda () x))
(let ((x 0))
(funcall *fun*)) ;should return 0
我想在定义函数时访问未定义的函数中的局部绑定(bind)。
如果我使用 x 作为参数,它会起作用,但我无法更改变量的值:
(defparameter *fun*
(lambda (x) (setf x (+ x 1))))
(let ((x 0))
(funcall *fun* x)) ;should return 1, would return 0
我怎样才能做我想做的事?
最佳答案
您可以在绑定(bind)站点和引用站点都声明变量特殊(动态):
(defparameter *fun*
(lambda () (declare (special x)) x))
(let ((x 0))
(declare (special x))
(funcall *fun*))
或全局:
(defvar *x*) ;; makes *x* special
(defparameter *fun*
(lambda () *x*))
(let ((*x* 0))
(funcall *fun*))
后期编辑:
在这种情况下,宏可能会更好地为您服务。函数唯一可以访问的词法绑定(bind)是创建它时存在的那些。例如,您描述的行为是由宏 incf 中的标准给出的。 define-modify-macro 是一个类似于 incf 的宏定义助手。 http://www.lispworks.com/documentation/HyperSpec/Body/m_defi_2.htm
关于lisp - 普通口齿不清 : Use undefined variable in function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814934/