【问题标题】:Test if array is inside a list in lisp测试数组是否在 lisp 的列表中
【发布时间】:2013-10-17 17:47:51
【问题描述】:

我有两个项目。第一个 a-child 是一个列表,其中包含一个数组作为其第一个元素,然后包含一些字符串作为其余元素。另一个mapped 是一个包含许多数组的列表。通过检查,很容易看出a-childmapped 中,但我找不到可以为我找到它的函数。

对于下面糟糕的 lisp 风格,我深表歉意 - 我是几天前开始的,所以我还没有掌握所有的约定。

(defparameter a-child (list (#2A((1 2 3) (7 4 5) (9 8 6))) "U" "R" "R"))
(defparameter mapped (list (#2A((1 2 3) (7 4 5) (9 8 6))) (#2A((1 2 3) (4 5 6) (7 8 9)))))
(find (car a-child) mapped)   ;;returns NIL
(member (car a-child) mapped) ;;returns NIL
(position (car a-child) mapped) ;;returns NIL
(equalp (car a-child) (car mapped)) ;;returns T

我可以使用什么函数在数组列表中查找数组?谢谢。

【问题讨论】:

    标签: arrays list find common-lisp clisp


    【解决方案1】:

    答案

    如果您将 :test #'equalp 传递给它们,则标记为“返回 NIL”的序列函数将返回 T

    原因

    Common Lisp 中默认的Two-Argument Testeql

    这是 ANSI CL 标准提供的 4(!) 个通用比较函数之间最合理的选择:

    • eq 过于依赖实现,在数字和字符方面可能无法正常工作

    • equalequalp 遍历对象,因此对于大型对象需要很长时间,而对于圆形对象可能永远不会终止。

    另见the difference between eq, eql, equal, and equalp in Common Lisp

    【讨论】:

    • 完美,非常有帮助。非常感谢!
    • 在大多数较新的脚本语言中,类似于 CL 的 equal 是普通的比较运算符。值得注意的是,它直观地适用于字符串和向量。可能在 Lisp 中制作循环列表的可能性是为什么 equal 未被选为默认值的原因。在比较不同类型时,equal 不需要比eql 慢,因为它只需要在所有参数都是相同类型的情况下遍历数据结构。
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2015-12-15
    • 2019-04-03
    • 2017-02-12
    • 2011-09-02
    相关资源
    最近更新 更多