Translate

jueves, 6 de mayo de 2021

Tablas Hash en Lisp

 Las tablas hash guardan datos de la forma (clave valor). Se usan para guardar grandes cantidades de registros, donde la lectura de un registro se hace de forma muy rapida, sin importar el tamaño de la tabla. 

Para crear una tabla hash usamos:

(setf *mi-tabla* (make-hash-table))

Tanto para generar un registro como para leer se usa la funcion gethash en la forma (gethash clave *tabla-hash*)

Para crear registros:     

(setf (gethash 'clave1 *mi-tabla*) "arbolito")

(setf (gethash 'clave2 *mi-tabla*) "manteca")

(setf (gethash 'clave3 *mi-tabla*) "crema pastelera")

Para lectura:

(setf valor (gethash 'clave2 *mi-tabla*))

"manteca"

La funcion maphash permite aplicar una funcion especifica a cada par clave/valor de una tabla hash:

(maphash #'(lambda (clave valor) 

                (format t "~&~a --> ~a" clave valor)) 

         *mi-tabla*)         

CLAVE3 --> crema pastelera

CLAVE1 --> arbolito

CLAVE2 --> manteca

La clave siempre debe ser un simbolo. Si hay alguna duda le preguntamos al Peluca



Por ultimo veremos como guardar y leer desde el almacenamiento, porque no lo vi en todo el internet.

Usaremos las siguientes funciones:


(defun guardar (archivo dato)

  (with-open-file (out archivo

         :direction :output

         :if-exists :supersede)

    (with-standard-io-syntax

     (print dato out))))


(defun cargar (archivo)

  (with-open-file (in archivo)

    (with-standard-io-syntax

     (read in))))

     

Ok, para guardar en un archivo, aclaro que en ejemplo omito la carpeta donde guardo:                               

(guardar "tabla.dat" *mi-tabla*)


Ahora a cerrar el entorno de desarrollo, y lo abrimos nuevamente para probar la carga: (en la misma carpeta donde guardamos)                                                      

(setf *mi-tabla* (cargar "tabla.dat")


En algunas plataformas para usar ciertas carpetas debes tener permisos de administrador, root o superusuario, asi que asegurate que la carpeta usada no necesita permisos de lectura/escritura.  .-)