局部函数中的增量变量 lisp
Increment variable lisp in local function
如何在局部函数中递增变量并将更改持久化?
(defun inc(x) (+ x 1))
(setq a 1)
我希望这个 (inc a) 将 a 的值更改为 2
我搜索了这个问题,我找到了一些关于 setf 的东西,但我无法解决这个问题。
根据您的具体问题,这可能会在 Variable references in lisp 中得到解答,其中讨论了您可能遇到的特定词法范围问题。它甚至使用了递增变量值的相同示例,因此它特别相关。
但是,如果您只是想知道如何增加一个值,那么您可能会对标准函数 1+, where (1+ x) is equivalent to (+ x 1), and the macro incf 感兴趣,该函数可以将一个地方的值增加 1.
(let ((a 1)) (let ((a 1))
(1+ a)) (incf a)
a)
;=> 2 ;=> 2
但是,根据您的具体操作,这些可能对您不起作用(并且可能的重复更合适)。如果你试图用变量的 value 调用一个函数,然后让函数体影响变量绑定的变化,那么你不能做它。也就是说,没有 function 可以使这个工作:
(let ((a 1))
(foo a)
a)
;=> 2
函数foo是用变量a的值调用的,它是数字 1;它无法访问 variable,因此无法将 variable 绑定到新值。但是,宏 可以使用调用它的 unevaluated 形式,因此您可能会产生您可能正在寻找的副作用.例如:
(let ((a 1))
(incf a)
a)
;=> 2
但是,如上所述,您不能这样做:
(defun my-incf (x)
(incf x)) ; modifies the binding of x
(let ((a 1))
(my-incf a)
a)
;=> 2
因为调用incf改变了x的binding,这是一个变量这是 my-incf.
本地的
如何在局部函数中递增变量并将更改持久化?
(defun inc(x) (+ x 1))
(setq a 1)
我希望这个 (inc a) 将 a 的值更改为 2
我搜索了这个问题,我找到了一些关于 setf 的东西,但我无法解决这个问题。
根据您的具体问题,这可能会在 Variable references in lisp 中得到解答,其中讨论了您可能遇到的特定词法范围问题。它甚至使用了递增变量值的相同示例,因此它特别相关。
但是,如果您只是想知道如何增加一个值,那么您可能会对标准函数 1+, where (1+ x) is equivalent to (+ x 1), and the macro incf 感兴趣,该函数可以将一个地方的值增加 1.
(let ((a 1)) (let ((a 1))
(1+ a)) (incf a)
a)
;=> 2 ;=> 2
但是,根据您的具体操作,这些可能对您不起作用(并且可能的重复更合适)。如果你试图用变量的 value 调用一个函数,然后让函数体影响变量绑定的变化,那么你不能做它。也就是说,没有 function 可以使这个工作:
(let ((a 1))
(foo a)
a)
;=> 2
函数foo是用变量a的值调用的,它是数字 1;它无法访问 variable,因此无法将 variable 绑定到新值。但是,宏 可以使用调用它的 unevaluated 形式,因此您可能会产生您可能正在寻找的副作用.例如:
(let ((a 1))
(incf a)
a)
;=> 2
但是,如上所述,您不能这样做:
(defun my-incf (x)
(incf x)) ; modifies the binding of x
(let ((a 1))
(my-incf a)
a)
;=> 2
因为调用incf改变了x的binding,这是一个变量这是 my-incf.
本地的