Je travaille sur un projet de passe-temps de programmation génétique.Différence entre let * et set? en commun Lisp
J'ai une fonction/configuration de macro qui, lorsqu'elle est évaluée dans une forme setq/setf, va générer une liste qui ressemblera à ceci.
(setq trees (make-trees 2))
==> (+ x (abs x))
Ensuite, il se limite à une fonction lambda #<FUNCTION :LAMBDA (X) ... >
via l'utilisation stratégique des fonctions/macros
Cependant, je veux être un peu plus efficace avec ce que l'affectation manuellement aux variables, donc j'écrit quelque chose comme ceci:
(setq sample
(let* ((trees (make-trees 2))
(tree-bindings (bind-trees trees))
(evaluated-trees (eval-fitness tree-bindings))))
(list (trees tree-bindings evaluated-trees)))
Cependant, je reçois EVAL: trees has no value
lorsque je place ce sous une forme let. Mon soupçon est que les expansions de macro ne sont pas entièrement réalisées dans un LET par rapport à un SETF, mais cela n'a pas de sens pour moi.
Quelle est la cause de ce problème?
--- modifier: tirai mon code et placez le fichier entier dans un pastebin ---
Supposant que je décide qu'un setq ne va pas le faire pour moi et j'écrire une fonction simple faire:
(defun générer échantillon() (lET ((Twiggs (faire arbres 2))) (lET ((fixations d'arbres (bind-arbres twiggs))) (let ((évalué -trees (eval-fitness tree-bindings)))
(liste des liens-arbres de twiggs-arbres évalués)))))
Cela provoque une explosion des messages d'erreur du fichier d'aide (??!?) ... et "eval: variable twiggs n'a pas de valeur", qui provient de la définition de bind-trees sur l'inspection SLIME. Je suis raisonnablement sûr que j'ai complètement arrosé mes macros. http://pastebin.org/673619
Je ne comprends pas exactement ce que votre macro est en train de faire. Et que fait votre "utilisation stratégique des fonctions/macros", et avec tous les 'setq's de toplevel? – Ken
Eh bien, un setq est en quelque sorte le «bassin de population» mondial; les autres ne sont que des artefacts de développement. Mes macros génèrent dynamiquement une fonction à partir d'arborescences d'expressions assez arbitraires (il devient difficile de penser à "sorta"). –
Votre second extrait est incomplet. Que se passe-t-il dans le corps de votre forme 'let'? L'indentation est également trompeuse, et les parenthèses ne sont pas équilibrées. – Svante