Je suis en train de construire une table de hachage (entre autres actions) tandis que read
ing. Je ne veux pas que la table de hachage ait une portée globale (encore), donc je le fais avec une macro et gensym
. À l'intérieur de la macro x
, je définis une macro s
qui est similaire à setf
, mais définit une entrée dans une table de hachage au lieu de définir un symbole quelque part. Ça explose. Je pense que je comprends le message d'erreur, mais comment puis-je le faire fonctionner?construire une table de hachage avec gensym et macrolet
Le code:
#!/usr/bin/clisp -repl
(defmacro x (&rest statements)
(let ((config-variables (gensym)))
`(macrolet ((s (place value)
(setf (gethash 'place ,config-variables) value)))
(let ((,config-variables (make-hash-table :test #'eq)))
(progn ,@statements)
,config-variables))))
(defun load-config()
(let ((config-file-tree (read *standard-input*)))
(eval config-file-tree)))
(defun load-test-config()
(with-input-from-string (*standard-input* "(x (s fred 3) (s barney 5))")
(load-config)))
(load-test-config)
La sortie:
*** - LET*: variable #:G12655 has no value
The following restarts are available:
USE-VALUE :R1 Input a value to be used instead of #:G12655.
STORE-VALUE :R2 Input a new value for #:G12655.
SKIP :R3 skip (LOAD-TEST-CONFIG)
STOP :R4 stop loading file /u/asterisk/semicolon/build.l/stackoverflow-semi
Cela semble si compliqué que je serais prêt à parier que vous n'avez pas besoin quoi que ce soit de cette. Une macro, un macrolet, EVALuation des données de lecture, des noms de macro à une seule lettre, ... –
D'habitude, je suis d'accord: c'est trop compliqué. Mais cela fait partie de quelque chose de plus impliqué. Je l'ai distillé à une situation de bouchée qui a rendu la question plus facile à poser. –
Pourquoi voudriez-vous encoder une table de hachage comme code source Lisp? –