哈希表的等式谓词

Mar*_*ark 4 lisp comparison hashtable predicate common-lisp

作为这项调查的结果,我们知道使用特殊功能(针对某些类型的数据进行了优化)是一个好主意.我想创建一个哈希表,但是这个来源说:

句法:

make-hash-table&key test size rehash-size rehash-threshold => hash-table

论点和价值观:

test - eq,eql,equalequalp函数之一的指示符.默认为eql.

好吧.如果我想在使用字符串并使用时加速我的程序string-equal怎么办?关于其他高阶函数的等式谓词没有限制,但make-hash-table它们是.这是什么原因?

奖金"lisp历史"问题:为什么函数gethash这样命名?为什么不get-hash呢?

sds*_*sds 5

什么是哈希表

哈希表通过计算对象的哈希并将对象存储在由哈希索引的井表中来工作.测试函数必须满足所有对象的基本条件,x并且y:

(FUNCALL test-function x y) ?
(= (FUNCALL hash-function x) (FUNCALL hash-function y))
Run Code Online (Sandbox Code Playgroud)

ANSI CL标准规定了4个标准测试函数,并且在实践中,实现具有相应的散列函数.

定义自己的测试/哈希

一些CL实现允许您定义自己的测试函数/散列函数对,例如,

你的具体问题

当表格是字符串键时,我发现使用符号非常有利可图.

我会创建一个特殊的并在那里实习我的字符串.

然后我会将值分配给相应的符号:而不是

(defparameter *mytable* (make-hash-table :test 'equal))
(setf (gethash "foo" *mytable*) <whatever>)
Run Code Online (Sandbox Code Playgroud)

我会做

(make-package "MY-PACKAGE")
(setf (symbol-value (intern "foo" "MY-PACKAGE")) <whatever>)
Run Code Online (Sandbox Code Playgroud)

读取字符串时,这是特别方便的,因为CL阅读器会为您实习.

当然有一些警告(例如,必须明确删除包,否则它们不会被GC),所以这可能不是胆小的.