我是 common lisp 的新手,我在 Linux 中使用 SBCL(版本 2.1.5),我正在学习 SOME 应用运算符,并且我运行了这两个示例,在我看来,它们给出了不一致的结果:
(一些 #'= '(1 2 3 4 5) '(5 4 3 2 1)) T
(一些 #'= '(1 2 3 4) '(4 3 2 1)) NIL
第一次调用对我来说有意义,但第二次调用似乎不一致。为什么第二次调用不像第一次调用那样返回“T”?
感谢您帮助理解这一点。
(some #'= '(1 2 3 4) '(4 3 2 1))
Run Code Online (Sandbox Code Playgroud)
方法
(or (= 1 4)
(= 2 3)
(= 3 2)
(= 4 1))
Run Code Online (Sandbox Code Playgroud)
也就是说:该函数=
应用于给定序列的第一个元素,然后应用于第二个元素,依此类推。一旦其中一个序列用完,它就会结束。
如果你想在两个列表之间设置交集(:test
这里有点多余,因为默认测试eql
也比较数字):
(intersection '(1 2 3 4) '(4 3 2 1) :test #'=)
Run Code Online (Sandbox Code Playgroud)
这将返回整个交叉点。如果你只需要测试是否有共同成员,一找到就结束,可以这样做:
(find-if (lambda (e)
(member e '(4 3 2 1)))
'(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
或者
(loop :for e :in '(1 2 3 4)
:thereis (member e '(4 3 2 1)))
Run Code Online (Sandbox Code Playgroud)