【发布时间】:2019-06-30 19:20:02
【问题描述】:
我正在尝试在 Common Lisp 中创建一个哈希表来将字符存储为键,但如果我使用重音字符,哈希表将不起作用。它只需要一个可能的带有重音符号的键。
在这个例子中,我添加了 5 个键,然后看到哈希表显示了 5 个元素,然后添加了另外 5 个带重音符号的元素,表格显示了 6 个元素,然后添加了另一个“正常”的 5 个元素,大小变为 11(如预期)。
发生了什么?我该如何解决这个问题?
(defparameter *h* (make-hash-table))
(setf (gethash #\A *h*) #\A)
(setf (gethash #\E *h*) #\A)
(setf (gethash #\I *h*) #\A)
(setf (gethash #\O *h*) #\A)
(setf (gethash #\U *h*) #\A)
(hash-table-count *h*)
(setf (gethash #\á *h*) #\A)
(setf (gethash #\é *h*) #\A)
(setf (gethash #\í *h*) #\A)
(setf (gethash #\ó *h*) #\A)
(setf (gethash #\ú *h*) #\A)
(hash-table-count *h*)
(setf (gethash #\a *h*) #\A)
(setf (gethash #\e *h*) #\A)
(setf (gethash #\i *h*) #\A)
(setf (gethash #\o *h*) #\A)
(setf (gethash #\u *h*) #\A)
(hash-table-count *h*)
【问题讨论】:
-
您使用的是哪种实现方式?定义
*h*时是否尝试过使用另一个test函数? -
SBCL,我不明白你定义另一个“测试”函数是什么意思。
-
您可以为
make-hash-table提供一个可选的test关键字,该关键字确定使用哪个函数来测试两个哈希键是否相等。在 hyperspec 中查看其文档。 -
这可能是正确的。如果我从终端执行 sbcl 并使用
(eq #\É #\Á),它会显示NIL(我在~/.sbclrc中有(setf sb-impl::*default-external-format* :utf-8)行)但是如果我从Sublime Text 中的SublimeREPL 执行它,它会显示T。谢谢你。虽然这个答案可能仍然无法回答,但我可能会删除它。 -
我会说这是 SBCL 中的一个错误。如果外部格式导致
#\É和#\Á未正确解码,则读者应进行诊断。基本上这里似乎发生的是原始 UTF-8 遵循黑斜线,而反斜线语法只占用第一个字节(两个字符都是#xC3),无法诊断尾随垃圾。
标签: unicode lisp common-lisp hashtable