2009-09-11 8 views
19

文字列をキーとするハッシュテーブルなどの辞書タイプを作成しようとしています。これはLispで可能か賢明ですか?Common 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 

答えて

31

あなたはEQL「場合は代わりに等しい」を使用し、ハッシュ・テーブルを作成する必要があります。 'eqlは' t 'と同じ内容の2つの文字列を評価しませんが、' equal 'は評価しません。ここで

は、あなたがそれを行う方法です。

(make-hash-table :test 'equal) 

skypherあなたは、大文字と小文字を区別しない文字列のハッシュをしたい場合は、代わり」equalpを使用することができます述べたように。

+3

この例では、CLHSだけがこれを持っています。それが明白でない場合は、ドキュメントを参照することが役立ちます。http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm –

+6

大文字と小文字を区別しない文字列ハッシングが必要な場合は、代わりにEQUALPを使用してください。 – skypher

+0

ありがとうございました。私はドキュメントをチェックしましたが、私は何かをジョグするために、その特定の部分の多くの平等関数に十分な注意を払っていませんでした。私は(間違った)仮定の下にあった "それはちょうど私が必要とするべきことをする"。 – Justicle