se puede construir mediante programación una tabla hash en tiempo de lectura:
(defvar *ht* #.(let ((ht (make-hash-table)))
(loop for (key . value) in
'((a . 1) (b . 2) (c . 3))
do (setf (gethash key ht) value))
ht))
(describe *ht*)
#.
se utiliza para la evaluación del tiempo de lectura. El compilador volcará la tabla hash al archivo FASL.
Esto entonces se puede compilar:
Usando SBCL:
* (compile-file "/tmp/test.lisp")
; compiling file "/private/tmp/test.lisp" (written 24 MAY 2012 10:08:49 PM):
; compiling (DEFVAR *HT* ...)
; compiling (DESCRIBE *HT*)
; /tmp/test.fasl written
; compilation finished in 0:00:00.360
#P"/private/tmp/test.fasl"
NIL
NIL
* (load *)
#<HASH-TABLE :TEST EQL :COUNT 3 {100299EA43}>
[hash-table]
Occupancy: 0.2
Rehash-threshold: 1.0
Rehash-size: 1.5
Size: 16
Synchronized: no
T
* *ht*
#<HASH-TABLE :TEST EQL :COUNT 3 {100299EA43}>
Creación de una tabla hash como una función:
(defun create-hashtable (alist
&key (test 'eql)
&aux (ht (make-hash-table :test test)))
(loop for (key . value) in alist
do (setf (gethash key ht) value))
ht)
https://github.com/vseloved/rutils/ blob/master/core/readtable.lisp # L10 –
Tenga en cuenta que, por ejemplo, http://www.aiai.ed.ac.uk/~jeff/lisp/cl-pitfalls advierte contra el uso de tablas hash como valores para formularios 'defconstant'. – Hugh
Gracias a todos. Parece que esta característica fundamental falta en el estándar y debe agregarse de alguna manera. En lugar de introducir una nueva sintaxis, imitando a Perl o PHP, ¿qué piensas sobre escribir una macro que envuelve make-hash-table y agrega la opción: initial-contents, la misma opción admitida en el estándar por, por ejemplo, make-array? Creo que esto probablemente no sea muy eficiente, ya que el contenido sería especificado por una alista que debe atravesarse, pero al menos es más consistente con la sintaxis de Lisp. –