定义没有缺点
(defun hash-keys (hash-table)
(loop for key being the hash-keys of hash-table collect key))
因为在 Common Lisp 中函数是编译的。如果你的供应商提供了这个功能,它几乎可以做同样的事情,并且不会比你的效率高多少,如果有的话。
在解释型语言中,与“内在”例程相比,您自己编写的几乎所有内容都存在性能劣势。
消耗散列的内容是浪费;循环让您在不占用内存的情况下处理哈希。所以也许你想要一个宏来代替(一些 Lisps 提供 dohash 或类似的扩展名)。
(defmacro do-hash ((key-var val-var hash-expr &optional result-form) &body body)
(let ((hash-var (gensym "HASH-")))
`(loop with ,hash-var = ,hash-expr
for ,key-var being the hash-keys of ,hash-var
for ,val-var being the hash-values of ,hash-var
do (progn ,@body)
finally (return ,result-form))))
或者哈希映射函数:
(defun mapc-hash (hash-table fun)
(loop for key being the hash-keys of hash-table
for value being the hash-values of hash-table
do (funcall fun key value)))
该语言是否应该拥有每个人都可以在一分钟内编写的所有可能的小工具?
在 Common Lisp 中,包含电池,但它们是其他类型的电池:实际上很难做到的事情。例如,用于在运行时动态编译代码的compile 函数。与以六种不同的方式从哈希表中提取键或值相比,大多数用户从头开始开发这样的东西是非常困难的。