:KEY 中使用的 EVENP 或 ODDP 如何与整数进行比较?

问题描述 投票:0回答:1

在规格书SEARCH功能页面,可以看到示例:

(search '(0 1) '(2 4 6 1 3 5) :key #'oddp) =>  2

您能解释一下这种比较是如何进行的吗?

确实,ODDP 函数返回一个“广义布尔值”,即

“用作真值的对象,其中符号nil代表 false,所有其他对象都代表 true。”

我尝试了几种方法来检查我的理解(在 SBCL 下):

CL-USER> (coerce (oddp 6) 'integer)
; Debugger entered on #<SIMPLE-TYPE-ERROR expected-type: INTEGER datum: NIL>
CL-USER> (eql 0 nil)
NIL
CL-USER> (equal 0 nil)
NIL
CL-USER> (equalp 0 nil)
NIL
CL-USER> (type-of (oddp 6))
NULL
CL-USER> (eql 0 (oddp 6))
NIL
CL-USER> (equal 0 (oddp 6))
NIL
CL-USER> (equalp 0 (oddp 6))
NIL

这意味着,SEARCH 的默认

:test
函数理论上无法比较 nil 和 0。

我是否理解 SEARCH 函数的这种行为实际上是由示例本身指定的?或者背后是否有什么东西隐式地将 NULL 对象(或 nil 值)与 0 进行比较,并将 true (t) 值与 1 进行比较?它是如何运作的?

common-lisp
1个回答
0
投票

SEARCH 函数不直接将数字与布尔值进行比较。相反,它比较将 ODDP 函数应用于两个序列的元素的结果。

具体来说,在

(search '(0 1) '(2 4 6 1 3 5) :key #'oddp) => 2
的情况下,首先对两个参数都执行关键函数
ODDP
,即
(0, 1)
变成
(NIL, T)
(2 4 6 1 3 5)
变成
(NIL, NIL, NIL, T, T, T)
然后
(NIL, T)
的位置是在
(NIL, NIL, NIL, T, T, T)
中搜索,因此返回
2
,因为这是在
(NIL, T)
中找到的第一个索引
(NIL, NIL, NIL, T, T, T)

© www.soinside.com 2019 - 2024. All rights reserved.