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

Posted

技术标签:

【中文标题】如何在 Common Lisp 中增加或减少数字?【英文标题】:How do I increment or decrement a number in Common Lisp? 【发布时间】:2011-04-13 18:14:47 【问题描述】:

惯用Common Lisp 增加/减少数字和/或数值变量的方法是什么?

【问题讨论】:

【参考方案1】:

如果您只想使用结果而不修改原始数字(参数),请使用内置的“+”或“-”函数,或者它们的简写“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

有关详细信息,请参阅 Common Lisp Hyperspec: 1+ incf/decf

【讨论】:

以上是关于如何在 Common Lisp 中增加或减少数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 common-lisp CLOS 中指向一个 defgeneric 实例

如何加快Common Lisp`IF`语句的编译速度?

ANSI Common Lisp Chapter 2

在 Common Lisp 中,符号名称是不是有定义的最大长度?

Common Lisp:按值传递与按引用传递[重复]

如何从 .asd 文件的目录编译和运行 Common Lisp 程序?