【发布时间】:2016-09-06 20:08:04
【问题描述】:
我想知道这段代码有什么问题。假设 *corpus 是一个单词列表(“at” “the” ...),这段代码试图将它们保存在一个哈希表中(单词重复-单词)
(defparameter h (make-hash-table))
(defparameter ex 0)
(loop for x in *corpus
do ((setf ex 0)
(loop for y being the hash-keys of h
if (equal x y) do ((incf (gethash y h)) (setf ex 1)))
if (eql ex 0)
do (setf (gethash x h) 1)))
如果单词在哈希表中,只需增加 1,否则添加一个新对。
【问题讨论】:
-
请正确格式化您的代码(例如使用 Emacs)。这对于我们能够阅读您的代码是必要的。例如,你肯定在
do之后有一个虚假的(,但我不知道你是否曾经关闭它(不是说它是相关的)。此外,您应该粘贴您看到的确切错误消息。 -
gethash采用可选的第三个参数 default,如果在哈希表中找不到密钥,则返回该参数。incf会很高兴地增加这个默认值,然后用新的键更新哈希表。因此,您在外循环中所要做的就是(incf (gethash x h 0))
标签: loops common-lisp hashtable nested-loops