2009-12-03 9 views

risposta

0

In Lisp viene solitamente definito un elenco di proprietà.

+1

No, gli elenchi di proprietà sono qualcosa di diverso. Vedere il glossario CLHS: http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_p.htm#property_list –

+2

Sì e no - un elenco di proprietà non è una tabella hash, ma fornisce un dizionario simile interfaccia (e la sua domanda specifica "... la struttura dei dati che è un insieme di coppie (chiave, valore) in cui i valori possono essere acceduti usando le chiavi." Un elenco di proprietà fornisce certamente esattamente ciò, anche se senza hashing (o qualcosa che si avvicina allo stesso prestazione...) –

7

Naturalmente - Common Lisp ha hash tables.

(setq a (make-hash-table)) 
(setf (gethash 'color a) 'brown) 
(setf (gethash 'name a) 'fred) 
(gethash 'color a) => brown 
(gethash 'name a) => fred 
(gethash 'pointy a) => nil 

elenchi di proprietà sono buoni per molto piccoli esempi di scopo dimostrativo, ma per qualsiasi esigenza reale la loro performance è abissale, in modo da utilizzare le tabelle hash.

11

Common Lisp ha almeno quattro modi diversi per farlo (memorizzazione valore della chiave):

  • immobili liste (: foo 1: bar 2)
  • elenchi associati ((: foo. 1) (: bar. 2))
  • tabelle hash
  • oggetti CLOS (valore di slot foo 'bar) per ottenere e (setf (valore di slot foo' bar) 42) da impostare. Il nome dello slot può essere memorizzato in una variabile: (let ((nome 'bar)) (nome valore foo slot)).

Per semplici elenchi di associazioni di utilizzo o elenchi di proprietà vanno bene. Con un numero maggiore di elementi tendono a diventare 'lenti'. Le tabelle hash sono "più veloci" ma hanno i loro compromessi. Gli oggetti CLOS sono usati come in molti altri sistemi di oggetti. Le chiavi sono i nomi degli slot definiti in una classe CLOS. Sebbene sia possibile programmare varianti che possono aggiungere e rimuovere slot all'accesso.

1

Sono incorporati hash tables, che utilizzano una funzione di hash di sistema (tipicamente SXHASH) e dove è possibile avere un paio di diversi controlli di uguaglianza (EQ, EQL, EQUAL o EQUALP a seconda di ciò che si considera essere "lo stesso" chiave).

Se le tabelle hash incorporate non sono abbastanza buone, è disponibile anche la libreria a generic hash table. Accetterà qualsiasi coppia di "generatore di hash"/"comparatore di chiavi" e ti costruirà una tabella di hash. Tuttavia, si basa sul fatto che una buona funzione di hash funzioni bene e che non sia necessariamente banale da scrivere.

Problemi correlati