在本地函数中增加变量lisp

时间:2015-01-05 14:58:49

标签: lisp global-variables common-lisp

如何在局部函数中增加变量并将更改保留?

(defun inc(x) (+ x 1))

(setq a 1)

我想要(inc a)将a的值更改为2

我搜索了这个问题,我找到了一些setf,但我无法解决问题。

1 个答案:

答案 0 :(得分:3)

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

但是,如果您只是在寻找如何增加值,那么您可能会对标准函数1+感兴趣,其中(1+ x)等同于< strong>(+ x 1),以及宏incf,用于通过 1 递增地点的值。

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

但是,根据您正在尝试做的事情,这些可能对您不起作用(并且可能的重复更合适)。如果您尝试使用变量的调用函数,然后让函数体对变量的绑定进行更改,则无法执行此操作。也就是说,没有功能可以使这项工作:

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

使用变量 a 调用函数 foo ,这是 1 ;它没有对变量的任何访问权限,因此它无法将变量绑定到新值。但是,可以使用它所调用的未评估的表单,因此您可以获得您可能正在寻找的那种副作用。 E.g:

(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 绑定,这是 my-incf <的本地变量/强>