2009-12-03 10 views

Respuesta

0

En Lisp generalmente se llama lista de propiedades.

+1

No, las listas de propiedades son algo diferente. Consulte el glosario de CLHS: http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_p.htm#property_list –

+2

Sí y no: una lista de propiedades no es una tabla hash, pero proporciona un diccionario similar interfaz (y su pregunta especifica "... la estructura de datos que es una colección de pares (clave, valor) donde los valores pueden accederse usando claves." Una lista de propiedades ciertamente proporciona exactamente eso, aunque sin hash (o cualquier cosa que se aproxime al mismo actuación...) –

7

Por supuesto - Common Lisp tiene 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 

listas de propiedades son muy buenos para pequeños ejemplos de finalidad demostrativa, sino para cualquier verdadero necesitan su rendimiento es pésimo, a fin de utilizar tablas hash.

9

Si se refiere a Common Lisp, hash tables son proporcionados por un tipo llamado hash-table.

Using these tables implica la creación de uno con la función de make-hash-table, la lectura de los valores con gethash, el establecimiento de ellos mediante el uso gethash como place en concierto con setf, y la eliminación de entradas con remhash.

La asignación desde el valor de la clave al código hash está disponible fuera de las tablas hash con la función sxhash.

11

Common Lisp tiene al menos cuatro formas diferentes de hacer que (el almacenamiento de claves de valor):

  • propiedad lists (: foo 1: bar 2)
  • listas de asociaciones ((: foo. 1) (: barra .2))
  • tablas hash
  • Objetos CLOS (valor de ranura foo 'bar) para obtener y (setf (valor de ranura foo' barra) 42) para establecer. El nombre de la ranura se puede almacenar en una variable: (let ((name 'bar)) (slot-value foo name)).

Para un uso simple, las listas de asociaciones o las listas de propiedades están bien. Con una mayor cantidad de elementos, tienden a ser "lentos". Las tablas hash son 'más rápidas' pero tienen sus propias compensaciones. Los objetos CLOS se usan como en muchos otros sistemas de objetos. Las claves son los nombres de ranura definidos en una clase CLOS. Aunque es posible programar variantes que pueden agregar y quitar ranuras en el acceso.

1

Hay hash tables incorporado, que utiliza una función de sistema hash (normalmente SXHASH) y donde puede tener un par de diferentes inspectores de igualdad (EQ, EQL, EQUAL o EQUALP dependiendo de lo que considere que es "lo mismo" llave).

Si las tablas hash incorporadas no son lo suficientemente buenas, también hay una biblioteca a generic hash table. Aceptará cualquier par de "generador de hash"/"comparador de claves" y te creará una tabla hash. Sin embargo, depende de tener una buena función hash para funcionar bien y eso no es necesariamente trivial para escribir.

Cuestiones relacionadas