Common-Lisp中`find`函数的意外行为

问题描述 投票:2回答:2

使用nil在序列中搜索find总是返回NIL

(find nil #(a b nil c)) -> NIL

(find nil #(a b c)) -> NIL

如果序列是列表则相同。

但是,member按照我的预期运作:

(member nil '(a b nil c)) -> (NIL C)

为什么find设计为这样运作?

请注意,position正如我所期望的那样工作:

(position nil #(a b nil c)) -> 2

(position nil #(a b c)) -> NIL
search common-lisp
2个回答
7
投票

如果目标元素是NIL,则FIND无用。它返回找到的元素,但它与未找到的案例无法区分。如果你想找出一个nil的序列,POSITION是一个更好的选择。还有很多其他选择。


1
投票

它返回nil,因为查找元素不在序列中的结果是nil。但即使有成员,如果它不在序列中,它将返回nil:

CL-USER> (member nil '(a b c))
NIL
CL-USER> 

因此,技术上在序列中搜索nil将返回nil与成员和位置,如果它不在那里当然可能混淆。

CL-USER> (position nil '(a b c))
NIL
CL-USER>

与位置的不同之处在于,如果出现nil,它会返回索引位置,正如您所指出的那样。 Find是这样设计的,因为它不是搜索索引位置,而是基本上搜索匹配该符号的指针,或返回nil。这就是为什么使用位置更有意义,正如你所指出的那样。

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