如何检查 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
,其计算结果为 T
或 NIL
。我想检查散列 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 以获得更多提示。
我有一个哈希 table
(setf ht (make-hash-table))
其中包含一些条目,例如 (setf (gethash 'first ht) 'first-value)
、(setf (gethash 'second ht) 'second-value)
、...
此外,我有一个谓词 test
,其计算结果为 T
或 NIL
。我想检查散列 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 以获得更多提示。