3.6 算术运算

Emacs Lisp 提供传统的四种算术运算(addition加、subtraction减、multiplication乘、division除),以及取余、取模、自增 1 和自减 1 函数。除 % 外,这些函数均接受整数和浮点数参数,只要任意一个参数是浮点数,就返回浮点数。

Function: 1+ number-or-marker

返回 number-or-marker 加 1。 示例:

(setq foo 4)
     ⇒ 4
(1+ foo)
     ⇒ 5

该函数不等价于 C 语言的 ++ — 它不会修改变量,只做加法计算。因此继续执行:

foo
     ⇒ 4

若要真正修改变量,必须配合 setq,如下:

(setq foo (1+ foo))
     ⇒ 5
Function: 1- number-or-marker

返回 number-or-marker 减 1。

Function: + &rest numbers-or-markers

对所有参数求和。无参数时返回 0。

(+)
     ⇒ 0
(+ 1)
     ⇒ 1
(+ 1 2 3 4)
     ⇒ 10
Function: - &optional number-or-marker &rest more-numbers-or-markers

- 有两个作用:取负、减法。 单个参数:返回其相反数; 多个参数:从第一个数 number-or-marker 中依次减去后面所有数 more-numbers-or-markers; 无参数:返回 0。

(- 10 1 2 3 4)
     ⇒ 0
(- 10)
     ⇒ -10
(-)
     ⇒ 0
Function: * &rest numbers-or-markers

对所有参数求积。无参数时返回 1。

(*)
     ⇒ 1
(* 1)
     ⇒ 1
(* 1 2 3 4)
     ⇒ 24
Function: / number &rest divisors

有一个或多个 divisors除数:将 number 依次除以每个 divisors除数,返回商; 无除数:返回 1/number(即倒数)。每个参数都可以是数值或标记(marker)

若所有参数均为整数,结果为整数,每次除法后向零取整。

(/ 6 2)
     ⇒ 3
(/ 5 2)
     ⇒ 2
(/ 5.0 2)
     ⇒ 2.5
(/ 5 2.0)
     ⇒ 2.5
(/ 5.0 2.0)
     ⇒ 2.5
(/ 4.0)
     ⇒ 0.25
(/ 4)
     ⇒ 0
(/ 25 3 2)
     ⇒ 4
(/ -17 6)
     ⇒ -2

如果将整数除以整数 0,Emacs 会抛出 arith-error 错误(see 错误)。 在使用 IEEE-754 浮点数的系统上,非零浮点数除以 0 会得到正无穷或负无穷(see 浮点数基础);否则,会照常抛出 arith-error 错误。

Function: % dividend divisor

该函数返回 dividend被除数除以 divisor除数 后的整数余数。参数必须是整数或标记(marker)。

对于任意两个整数 dividend被除数divisor除数,当除数非零时:

(+ (% dividend divisor)
   (* (/ dividend divisor) divisor))

divisor除数 不为零时,结果恒等于 dividend被除数

(% 9 4)
     ⇒ 1
(% -9 4)
     ⇒ -1
(% 9 -4)
     ⇒ 1
(% -9 -4)
     ⇒ -1
Function: mod dividend divisor

该函数返回 dividend被除数divisor除数 取模的结果;换句话说,是 dividend被除数 除以 divisor除数 的余数,但符号与除数相同。参数必须是数值或标记。

% 不同,mod 允许浮点数参数;它会将商向下取整(向负无穷方向),再用该商计算余数。

divisor除数 为 0,如果两个参数都是整数,mod 抛出 arith-error 错误,否则返回 NaN。

(mod 9 4)
     ⇒ 1
(mod -9 4)
     ⇒ 3
(mod 9 -4)
     ⇒ -3
(mod -9 -4)
     ⇒ -1
(mod 5.5 2.5)
     ⇒ .5

对于任意两个数值 dividend被除数divisor除数

(+ (mod dividend divisor)
   (* (floor dividend divisor) divisor))

恒等于 dividend被除数;若任一参数为浮点数,则可能存在舍入误差;若 dividend被除数 是整数且 divisor除数 为 0,则抛出 arith-error。关于 floor,见 数值转换


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike