lisp - 普通口齿不清 : Use undefined variable in function

标签 lisp common-lisp

我想在 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/

相关文章:

list - 理解 SICP 中的树 - 练习 2.24

lisp - Common Lisp 函数打开列表以显示列表中元素的顺序?

lisp - 将 Lisp 语法与 (operator-integer-operator) 格式混淆

lisp - 为闭包中的函数定义 setf

parameters - 在 lisp 中按值传递参数

loops - 在 Common Lisp 中循环等效的有序对

Lisp - 字符串连接

clojure - 在 Liberator Clojure 中发布未返回 200 OK

json - 如何获取 yason :encode-alist to return the encoded string instead of sending it to a stream?

arrays - 你如何在普通的 lisp 中复制一个数组?