在局部函数中增加变量 lisp



如何递增局部函数中的变量并保留更改?

(defun inc(x) (+ x 1))
(setq a 1)

我希望这个(inc a)将a的值更改为2

搜索了这个问题,我找到了setf的东西,但我无法解决问题。

根据您的确切问题,这可以在 lisp 中的变量引用中回答,它讨论了您可能遇到的词汇范围的特定问题。 它甚至使用相同的示例来增加变量的值,因此它特别相关。

但是,如果您只是在寻找如何递增值,那么您可能会对标准函数 1+ 感兴趣,其中 (1+ x) 等同于 (+ x 1),以及用于将位置的值递增 1 的宏 incf

(let ((a 1))      (let ((a 1))
  (1+ a))           (incf a)
                    a)
;=> 2             ;=> 2

但是,根据您要执行的操作,这些可能不适合您(并且可能的副本更合适)。 如果您尝试使用变量的值调用函数,然后让函数的主体影响变量绑定的更改,则无法执行此操作。 也就是说,没有函数可以使这项工作:

(let ((a 1))
  (foo a)
  a)
;=> 2

函数 foo 使用变量 a 的值(即数字 1)调用;它无法访问变量,因此它无法将变量绑定到新值。 但是,可以处理调用它的未计算窗体,因此您可能会遇到您可能正在寻找的副作用。 例如:

(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 的绑定Xmy-incf 的局部变量。

最新更新