2010-11-26 16 views
0

j'essayais de faire une macro pour la liaison variable si elle est unbind, sinon si elle est binded que annexant à sa valeurLisp macro set-ou-Nconc pas en mesure de faire fonctionner

(defmacro set-or-nconc (var &rest args) 
     `(,(if (and (boundp var) (not (null ,var))) 
       'nconc 'setq) 
      ,var ,@args)) 

Le sortie est destinée a voulu

(set-or-nconc i '(a b)) => '(a b) 
i      => '(a b) 
(set-or-nconc i '(a b)) => '(a b a b) 
i      => '(a b a b) 

Mais ma macro définie ne fonctionne pas particulièrement si i est binded à zéro ce que quelqu'un a idée quel est le problème avec cette macro?

Répondre

3

La détermination de l'utilisation setq ou nconc est effectuée au moment de la macro-expansion, pas au moment de l'exécution. C'est un peu un problème. Il y a aussi quelques problèmes avec votre expression de retour, car il y a un "," trop ((null ,var)) ou un trop petit nombre (dans (boundp var), avec le besoin d'un autre backquote).

ci-dessous est au moins quelque chose d'approchant une solution de travail, ce qui retarde le choix d'utiliser setq ou nconc jusqu'à l'exécution:

(defmacro set-or-nconc (var &rest args) 
    `(if (and (boundp ',var) (not (null ,var))) 
     (nconc ,var ,@args) 
    (setq ,var ,@args))) 

Il faut aussi savoir que l'utilisation de cela pour construire progressivement une liste aura plus- ou-moins O (n^2) comportement, il est généralement plus rapide de s'accumuler par défaut, puis (si nécessaire) faire un inverse à la fin.

+0

Oui ça fonctionne, merci beaucoup! Je vais essayer avec consing aussi bientôt. – Sharad