les gars.Problèmes lors de l'écriture `loop ... collect` dans la macro
Aujourd'hui, je veux écrire une macro sigma pour calculer la somme à partir de l'entrée d'expression flexible.
Le code ci-dessous est écrit cet après-midi. Mais cela ne marche pas suivre mon but.
(defmacro sigma (exp ll)
`(+ ,@(loop for i in ll collect
(progn (setf (elt exp 1) i)
(print exp)
exp)))
)
>>(pprint (macroexpand-1 '(sigma (+ 1 2) (2 3 4))))
>>(+ 2 2)
(+ 3 2)
(+ 4 2)
(+ (+ 4 2) (+ 4 2) (+ 4 2))
Je veux que ça fonctionne, mais (+ (+ 2 2) (+ 3 2) (+ 4 2))
loop collect
me donner la réponse bizarre.
Pourquoi ça marche comme ça? Est-ce que j'ai des méthodes pour résoudre ce problème?
Même si on ne mute il, il collecte le même objet 'exp' à chaque fois dans la boucle. – Barmar
@Barmar Je me souviens d'une fois que j'ai 'NCONC'-ed le même argument deux fois pour obtenir une liste double taille :-) – Sylwester