2009-09-11 12 views
19

Próbuję utworzyć typ "słownikowy" - tj. Tablicę skrótów z ciągiem znaków jako kluczem. Czy to możliwe czy mądre w Lisp?Używanie obiektu typu string jako klucza mieszania w Common Lisp

Zauważyłem, że to działa zgodnie z oczekiwaniami:

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

Jednak po nie:

> (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 

Odpowiedz

31

Musisz zrobić hash-table, który używa 'równy zamiast if' eql. 'eql nie ocenia dwóch łańcuchów o tej samej zawartości co' t, podczas gdy 'równy ma.

Oto jak to zrobić:

(make-hash-table :test 'equal) 

Jak skypher zauważyć można także użyć „equalp zamiast jeśli chcesz bez uwzględniania wielkości liter ciąg hashowania.

+3

Justicle, CLHS ma to tylko jako przykład. Jeśli nie jest to oczywiste, pomocna może być analiza dokumentacji: http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm –

+6

Zamiast tego użyj EQUALP, jeśli chcesz uwzględniać wielkość liter w haśle ciągów. – skypher

+0

Dzięki ludziom. Sprawdziłem dokumenty, ale tak naprawdę nie zwracałem wystarczającej uwagi na wiele funkcji równości dla tej części, aby pobiegać cokolwiek ze mną. Byłem pod (niepoprawnym) założeniem, że "powinno po prostu robić to, czego potrzebuję". – Justicle