(rassoc) 当 (find) 不返回 NIL 时,在嵌套列表上返回 NIL

问题描述 投票:0回答:1

我想对这样的嵌套列表执行

(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

common-lisp ansi-common-lisp
1个回答
1
投票
您错误地使用了

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>)
    
© www.soinside.com 2019 - 2024. All rights reserved.