【问题标题】:Member function with multi-level list in Common LispCommon Lisp 中具有多级列表的成员函数
【发布时间】:2016-12-20 19:43:40
【问题描述】:

我正在尝试了解它如何使用列表和列表列表的成员函数。
这里举个例子。

(member '(A 6) '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'second)   

我想用成员函数检查列表 '(A 6) 的第二个参数是否是输入中第二个列表的成员。 答案应该是

true

但我做错了,因为 Common Lisp 回复:

 Error: Cannot coerce (A 6) to type STRING. 

那么我怎样才能从第一个列表中获取第二个参数呢? 谢谢你的帮助。

【问题讨论】:

    标签: list function common-lisp member


    【解决方案1】:

    您缺少的是:key 参数没有应用于member 的第一个参数。

    另一件事是second 将返回数字,而不是符号

    因此:

    (member 'A '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first)
    ==> ((A 7) (B 6) (E 6) (D 5))
    (member 'C '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first)
    ==> NIL
    (member 'E '((A 7) (B 6) (E 6) (D 5)) :test #'string-equal :key #'first)
    ==> ((E 6) (D 5))
    

    注意返回值是tail,而不是匹配的列表元素。 这是为了允许使用member 作为谓词,即区分找到nil 和什么也没找到:

    (member nil '(1 2 nil 3))
    ==> (NIL 3)
    (find nil '(1 2 nil 3))
    ==> NIL
    (find t '(1 2 nil 3))
    ==> NIL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多