如何检查 hash-table 中的每个值是否满足 Common Lisp 中的谓词

How to check that every value in a hash-table satisfies a predicate in Common Lisp

我有一个哈希 table (setf ht (make-hash-table)) 其中包含一些条目,例如 (setf (gethash 'first ht) 'first-value)(setf (gethash 'second ht) 'second-value)、...

此外,我有一个谓词 test,其计算结果为 TNIL。我想检查散列 table ht 的所有第一个条目是否满足 test 谓词。例如,如果散列 table 仅包含上面给出的两个条目,我想知道 (and (test 'first) (test 'second)) 的评估。有简单的方法吗?

您想知道如何使用 every 处理序列和哈希表。

您可以使用 loop 宏遍历每个值并使用 :always 检查每个元素以进行测试。与 every 一样,当测试为 NIL.

时,:always 将立即终止循环
(defun hash-every (test hash)
 (loop :for value :being :the :hash-values :in hash 
       :always (funcall test value)))

(hash-every #'numberp ht) ; ==> NIL
(hash-every #'symbolp ht) ; ==> T

您可能想查看 Common Lisp Cookbok's hash table page 以获得更多提示。