增加/减少数字和/或数字变量的惯用Common Lisp 方法是什么?
问问题
24341 次
1 回答
39
如果您只想使用结果而不修改原始数字(参数),请使用内置的“+”或“-”函数,或者它们的简写“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.
请注意,Common Lisp 规范将上述两种形式定义为在含义上等价,并建议实现使它们在性能上等价。虽然这是一个建议,但根据 Lisp 专家的说法,任何“自尊”的实现都应该没有性能差异。
如果你想更新 num(不仅仅是获取 1 + 它的值),那么使用“incf”:
(setf num 41)
(incf num) ; returns 42, and num is now 42.
(setf num 41)
(decf num) ; returns 40, and num is now 40.
(incf 41) ; FAIL! Can't modify a literal
笔记:
您还可以使用 incf/decf 增加(减少)超过 1 个单位:
(setf foo 40)
(incf foo 2.5) ; returns 42.5, and foo is now 42.5
于 2010-09-17T14:16:49.187 回答