我想对这样的嵌套列表执行
(rassoc)
:
(setq mlist
(list (list (cons "A" 0)
(make-hash-table))
(list (cons "B" 1)
(make-hash-table))))
奇怪的是,
(find)
和(assoc)
按预期工作,但(rassoc)
失败。
(format t "~A~%" (assoc "A" mlist :key #'car :test #'equal))
(format t "~A~%" (find 0 mlist :key #'cdar :test #'equal))
(format t "~A~%" (rassoc 0 mlist :key #'car :test #'equal))
Common Lisp HyperSpec 指出:
表情因此,鉴于此,我想知道这是一个错误还是我只是错误地使用了
和
(rassoc item list :test fn)
含义相同,除非该项目为
(find item list :test fn :key #'cdr)
nil
且出现nil
代替列表中的一对。请参阅函数 assoc。
(rassoc)
?我正在使用 sbcl 2.4.0
rassoc
。
rassoc
查看列表中 te 条目的
cdr
,跳过
nil
条目,并将它们(或对它们应用关键函数的结果)与您想要的进行比较。列表中条目的
cdr
是包含哈希表的单元素列表,您将与这些哈希表进行比较,键为
#'car
。如果您想要做的是检查列表中
rassoc
的第二个元素,则根本不应该使用
car
。而是使用
assoc
和适当的键:
> (assoc "A" mlist :key #'car :test #'equal)
(("A" . 0) #<eql Hash Table{0} 82200283A3>)
> (assoc 0 mlist :key #'cdr)
(("A" . 0) #<eql Hash Table{0} 82200283A3>)