想了解为什么下面示例中的 SOME 函数返回不一致的结果

Tod*_*odd 1 sbcl common-lisp

我是 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”?

感谢您帮助理解这一点。

Sva*_*nte 7

(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)