我想在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)
我怎么能做我想做的事?
您可以在绑定站点和引用站点声明变量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
归档时间: |
|
查看次数: |
1034 次 |
最近记录: |