如何在Common Lisp中增加或减少一个数字?

如何在Common Lisp中增加或减少一个数字?,lisp,common-lisp,increment,decrement,Lisp,Common Lisp,Increment,Decrement,常用的Lisp递增/递减数字和/或数值变量的方法是什么?如果只想使用结果,而不修改原始数字(参数),请使用内置的“+”或“-”函数,或其缩写“1+”或“1-”。如果要修改原始位置(包含数字),请使用内置的“incf”或“decf”函数 使用加法运算符: (setf num 41) (+ 1 num) ; returns 42, does not modify num (+ num 1) ; returns 42, does not modify num (- num 1) ; ret

常用的Lisp递增/递减数字和/或数值变量的方法是什么?

如果只想使用结果,而不修改原始数字(参数),请使用内置的“+”或“-”函数,或其缩写“1+”或“1-”。如果要修改原始位置(包含数字),请使用内置的“incf”或“decf”函数

使用加法运算符:

(setf num 41)
(+ 1 num)   ; returns 42, does not modify num
(+ num 1)   ; returns 42, does not modify num
(- num 1)   ; returns 40, does not modify num
(- 1 num)   ; NOTE: returns -40, since a - b is not the same as  b - a
或者,如果您愿意,您可以使用以下简称:

(1+ num)    ; returns 42, does not modify num.
(1- num)    ; returns 40, does not modify num. 
请注意,公共Lisp规范将上述两种形式定义为在意义上等效,并建议实现使它们在性能上等效。尽管这是一个建议,但Lisp专家认为,任何“自尊”的实现都不应该看到性能差异

如果您想更新num(而不仅仅是获取1+其值),请使用“incf”:

注:

您还可以使用incf/decf增加(减少)超过1个单位:

(setf foo 40)
(incf foo 2.5)  ; returns 42.5, and foo is now 42.5
有关详细信息,请参见通用Lisp Hyperspec:

(setf foo 40)
(incf foo 2.5)  ; returns 42.5, and foo is now 42.5