【问题标题】:auto-generate key for hash table in common lisp在 common lisp 中为哈希表自动生成键
【发布时间】:2017-11-09 08:14:13
【问题描述】:

我想生成可以跨多个哈希表使用的顺序键。我会称它们为 'id1'、'id2' 等。如果 ht 是我的哈希表,那么我想将字符串中的符号作为键。要将条目添加到哈希表中,我想这样做:

(setf (gethash (make-symbol "id1") ht) 1)

然后用

再次访问它
(gethash 'id1 ht)

我不认为 make-symbol 给了我我想要的东西,并且密钥 'id1' 没有被识别。

制作这把钥匙的最佳方法是什么?

【问题讨论】:

  • 您可能正在泄漏符号。为什么不直接使用字符串作为键呢?
  • 我在想符号查找会比字符串快。我会做速度比较。如果没有速度命中,那么字符串会更简单。

标签: common-lisp hashtable symbols case-sensitive


【解决方案1】:

错误:符号应该在一个包中并且需要正确的大小写

在你的情况下,我们有:

CL-USER 24 > (symbol-name (make-symbol "id0"))
"id0"

CL-USER 25 > (symbol-package (make-symbol "id0"))
NIL

请确保您考虑以下事项:

  • 在包中实习符号
  • 在正确的包中实习符号
  • 确保符号名称正确且大小写正确
  • 用您打算使用的大小写写符号,可能需要转义符号以保留大小写

示例:

大写符号和小写符号名称 -> 不是 eq

CL-USER 26 > (eq 'id0 (intern "id0" "CL-USER"))
NIL

大写符号和大写符号名->是eq

CL-USER 27 > (eq 'id0 (intern "ID0" "CL-USER"))
T

转义&小写符号和小写符号名称 -> 是 eq

CL-USER 28 > (eq '|id0| (intern "id0" "CL-USER"))
T

【讨论】:

    【解决方案2】:

    make-symbol 创建非驻留符号。这意味着您每次都会有一个独特的符号。要获取实习符号,请改用intern

    【讨论】:

    • 感谢您的回复。但它仍然与密钥不匹配。 CL-USER> (setf (gethash (intern "id1234") tt) 1234) CL-USER> (gethash 'id1234 tt) NIL NIL
    • @DavidWallis 取决于阅读器的设置,符号可能会自动大写,而被实习的字符串则不会。试试(eq (intern "ID1234") 'id1234)。请参阅the documentation Rainer 还提到了包。我建议使用keyword 包。然后你可以和:id1234比较
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2011-08-19
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多