Buscar..


Creando una tabla hash

Las tablas hash son creadas por make-hash-table :

(defvar *my-table* (make-hash-table))

La función puede tomar parámetros de palabras clave para especificar aún más el comportamiento de la tabla hash resultante:

  • test : selecciona la función que se usa para comparar claves para la igualdad. Tal vez un designador para una de las funciones eq , eql , equal o equalp . El valor predeterminado es eq .
  • size : una sugerencia para la implementación sobre el espacio que puede requerirse inicialmente.
  • rehash-size : si es un número entero (> = 1), al hacer un rehash, la tabla hash aumentará su capacidad en el número especificado. De lo contrario, un flotador (> 1.0), entonces la tabla hash aumentará su capacidad al producto del rehash-size y la capacidad anterior.
  • rehash-threshold : especifica qué tan completa debe estar la tabla hash para activar un rehash.

Iterando sobre las entradas de una tabla hash con maphash

(defun print-entry (key value)
  (format t "~A => ~A~%" key value))

(maphash #'print-entry *my-table*) ;; => NIL

El uso de maphash permite iterar sobre las entradas de una tabla hash. El orden de iteración no está especificado. El primer argumento es una función que acepta dos parámetros: la clave y el valor de la entrada actual.

maphash siempre devuelve NIL .

Iterando sobre las entradas de una tabla hash con bucle

La macro de bucle admite la iteración sobre las claves, los valores o las claves y valores de una tabla hash. Los siguientes ejemplos muestran posibilidades, pero la sintaxis de bucle completo permite más combinaciones y variantes.

Sobre llaves y valores.

(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for k being each hash-key of ht
     using (hash-value v)
     collect (cons k v)))
;;=> ((A . 1) (B . 2))
(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for v being each hash-value of ht
     using (hash-key k)
     collect (cons k v)))
;;=> ((A . 1) (B . 2))

Sobre llaves

(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for k being each hash-key of ht
       collect k))
;;=> (A B)

Sobre valores

(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for v being each hash-value of ht
       collect v))
;;=> (1 2)

Iterando sobre las entradas de una tabla hash con un iterador de tabla hash

Las claves y los valores de una tabla hash pueden repetirse utilizando la macro with-hash-table-iterator . Esto puede ser un poco más complejo que el maphash o el bucle , pero podría usarse para implementar las construcciones de iteración utilizadas en esos métodos. with-hash-table-iterator toma un nombre y una tabla hash y vincula el nombre dentro de un cuerpo de modo que las sucesivas llamadas al nombre produzcan múltiples valores: (i) un valor booleano que indica si un valor está presente; (ii) la clave de la entrada; y (iii) el valor de la entrada.

(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (with-hash-table-iterator (iterator ht)
    (print (multiple-value-list (iterator)))
    (print (multiple-value-list (iterator)))
    (print (multiple-value-list (iterator)))))

;; (T A 1) 
;; (T B 2) 
;; (NIL) 


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow