【问题标题】:Using string object as a hash key in Common Lisp在 Common Lisp 中使用字符串对象作为哈希键
【发布时间】:2009-09-11 05:04:26
【问题描述】:

我正在尝试创建一个“字典”类型 - 即以字符串为键的哈希表。这在 Lisp 中是可能的还是明智的?

我注意到这按预期工作:

> (setq table (make-hash-table))
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA46>
> (setf (gethash 1 table) "one")
"one"
> (gethash 1 table)
"one"

但是,以下不是:

> (setq table (make-hash-table))
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA0E>
> table
#<HASH-TABLE :TEST EQL size 0/60 #x91AFA0E>
> (setf (gethash "one" table) 1)
1
> (gethash "one" table)
NIL
NIL

【问题讨论】:

    标签: hash dictionary lisp common-lisp


    【解决方案1】:

    您需要制作使用 'equal 而不是 'eql 的哈希表。 'eql 不会将具有相同内容的两个字符串评估为 't,而 'equal 会。

    这是你的做法:

    (make-hash-table :test 'equal)
    

    正如 skypher 所说,如果您想要不区分大小写的字符串哈希,也可以使用 'equalp。

    【讨论】:

    • Justicle,CLHS 就是以这个为例。如果不明显,查看文档可能会有所帮助:lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm
    • 如果您想要不区分大小写的字符串散列,请改用 EQUALP。
    • 谢谢各位。我检查了文档,但我并没有真正关注该特定部分的许多相等函数,无法与我一起慢跑。我的(不正确的)假设是“它应该只做我需要的”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2021-10-28
    • 2012-03-31
    相关资源
    最近更新 更多