在规格书的SEARCH功能页面,可以看到示例:
(search '(0 1) '(2 4 6 1 3 5) :key #'oddp) => 2
您能解释一下这种比较是如何进行的吗?
“用作真值的对象,其中符号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 进行比较?它是如何运作的?
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)
。