Skip to content

LISP - 数字谓词

数值谓词是用于测试数字是否具有特定属性并返回布尔值(T 表示真,nil 表示假)的函数。它们是任何 Lisp 程序中逻辑和控制流的基本组成部分。

以下是最常见的数值谓词:

PredicateDescription
evenp number如果 number 是偶数整数,则返回 T,否则返回 nil。
oddp number如果 number 是奇数整数,则返回 T,否则返回 nil。
zerop number如果 number 是零,则返回 T,否则返回 nil。适用于整数和浮点数。
plusp number如果 number 是严格正数 (> 0),则返回 T,否则返回 nil。
minusp number如果 number 是严格负数 (< 0),则返回 T,否则返回 nil。

以下代码演示了每个谓词的实际应用。注释显示了在 REPL 中会看到的预期返回值。

;; --- evenp 和 oddp ---
(evenp 10) ; => T
(evenp 7) ; => NIL
(oddp 7) ; => T
(oddp 10) ; => NIL
;; --- zerop ---
(zerop 0) ; => T
(zerop 0.0) ; => T
(zerop 100) ; => NIL
;; --- plusp ---
(plusp 55) ; => T
(plusp 0.1) ; => T
(plusp 0) ; => NIL
(plusp -5) ; => NIL
;; --- minusp ---
(minusp -99) ; => T
(minusp -0.5) ; => T
(minusp 0) ; => NIL
(minusp 99) ; => NIL

谓词最常用于使用 if 和 cond 等条件语句来控制程序的流程。

(defun describe-number (n)
(cond
((zerop n) "The number is zero.")
((minusp n) "The number is negative.")
((plusp n) (if (evenp n)
"The number is positive and even."
"The number is positive and odd."))
(t "This is not a real number."))) ; 备用情况
(print (describe-number -10))
(print (describe-number 7))
(print (describe-number 0))
"The number is negative."
"The number is positive and odd."
"The number is zero."

虽然上述函数检查的是属性,但另一类重要的谓词是检查类型和相等性。

  • 类型谓词:numberp、integerp、floatp 和 rationalp 检查对象是否为特定数值类型。
  • 比较谓词:函数 =、/=、<、>、<= 和 >= 也是谓词。它们用于数值比较,可以接受多个参数。例如,(< 1 5 10) 返回 T,因为 1 小于 5,且 5 小于 10。
(numberp 10) ; => T
(floatp 3.14) ; => T
(integerp 3.14) ; => NIL
(= 5 5 5) ; => T
(/= 5 6 7) ; => T (all are different from each other)
(<= 1 2 2 3) ; => T