在Common Lisp中使用字符串对象作为哈希键

Jus*_*cle 19 lisp hash dictionary common-lisp

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

我注意到这可以按预期工作:

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

但是,以下内容不是:

> (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
Run Code Online (Sandbox Code Playgroud)

fre*_*net 35

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

这是你如何做到的:

(make-hash-table :test 'equal)
Run Code Online (Sandbox Code Playgroud)

正如skypher所指出的,如果你想要不区分大小写的字符串哈希,你也可以使用'equalp.

  • 如果您想要不区分大小写的字符串哈希,请使用EQUALP. (6认同)
  • Justicle,CLHS就是以此为例.如果不是很明显,查看文档可能有所帮助:http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm (3认同)