Lisp - 运算符



运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。LISP 允许对数据进行大量操作,并由各种函数、宏和其他构造支持。

允许对数据进行的操作可以归类为:

  • 算术运算
  • 比较运算
  • 逻辑运算
  • 按位运算

算术运算

下表显示了 LISP 支持的所有算术运算符。假设变量A保存 10,变量B保存 20,则:

显示示例

运算符 描述 示例
+ 将两个操作数相加 (+A B) 将得到 30
- 从第一个操作数中减去第二个操作数 (- A B) 将得到 -10
* 将两个操作数相乘 (* A B) 将得到 200
/ 将分子除以分母 (/ B A) 将得到 2
mod,rem 模运算符和整数除法后的余数 (mod B A )将得到 0
incf 增量运算符将整数值增加指定第二个参数 (incf A 3) 将得到 13
decf 减量运算符将整数值减少指定第二个参数 (decf A 4) 将得到 9

比较运算

下表显示了 LISP 支持的所有关系运算符,它们比较数字之间的大小。但是,与其他语言中的关系运算符不同,LISP 比较运算符可以接受两个以上的操作数,并且它们仅适用于数字。

假设变量A保存 10,变量B保存 20,则:

显示示例

运算符 描述 示例
= 检查操作数的值是否都相等,如果相等,则条件为真。 (= A B) 为假。
/= 检查操作数的值是否都不相等,如果值不相等,则条件为真。 (/= A B) 为真。
> 检查操作数的值是否单调递减。 (> A B) 为假。
< 检查操作数的值是否单调递增。 (< A B) 为真。
>= 检查任何左侧操作数的值是否大于或等于下一个右侧操作数的值,如果大于或等于,则条件为真。 (>= A B) 为假。
<= 检查任何左侧操作数的值是否小于或等于其右侧操作数的值,如果小于或等于,则条件为真。 (<= A B) 为真。
max 它比较两个或多个参数,并返回最大值。 (max A B) 返回 20
min 它比较两个或多个参数,并返回最小值。 (min A B) 返回 10

布尔值上的逻辑运算

Common LISP 提供三个逻辑运算符:and、ornot,它们对布尔值进行操作。假设A的值为 nil,B的值为 5,则:

显示示例

运算符 描述 示例
and 它接受任意数量的参数。参数从左到右求值。如果所有参数都求值为非 nil,则返回最后一个参数的值。否则返回 nil。 (and A B) 将返回 NIL。
or 它接受任意数量的参数。参数从左到右求值,直到一个参数求值为非 nil,在这种情况下,返回该参数的值,否则返回nil (or A B) 将返回 5。
not 它接受一个参数,如果参数求值为nil,则返回t (not A) 将返回 T。

数字上的按位运算

按位运算符作用于位,并执行逐位运算。按位与、或和异或运算的真值表如下所示:

显示示例

p q p and q p or q p xor q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Assume if A = 60; and B = 13; now in binary format they will be as follows:
A = 0011 1100
B = 0000 1101
-----------------
A and B = 0000 1100
A or B = 0011 1101
A xor B = 0011 0001
not A  = 1100 0011

LISP 支持的按位运算符列在下表中。假设变量A保存 60,变量B保存 13,则:

运算符 描述 示例
logand 这将返回其参数的按位逻辑与。如果没有给出参数,则结果为 -1,这是此运算的单位元。 (logand a b)) 将得到 12
logior 这将返回其参数的按位逻辑包含或。如果没有给出参数,则结果为零,这是此运算的单位元。 (logior a b) 将得到 61
logxor 这将返回其参数的按位逻辑异或。如果没有给出参数,则结果为零,这是此运算的单位元。 (logxor a b) 将得到 49
lognor 这将返回其参数的按位非。如果没有给出参数,则结果为 -1,这是此运算的单位元。 (lognor a b) 将得到 -62,
logeqv 这将返回其参数的按位逻辑等价(也称为异或非)。如果没有给出参数,则结果为 -1,这是此运算的单位元。 (logeqv a b) 将得到 -50
广告