2010-11-26 1 views
0

ich ein Makro für die Bindung variabel zu machen versuchten, wenn es unbind ist, sonst, wenn es als Lisp Makro Set-or-nconc nicht in der Lage zu bekommen arbeiten

, um seinen Wert anhängt binded wird
(defmacro set-or-nconc (var &rest args) 
     `(,(if (and (boundp var) (not (null ,var))) 
       'nconc 'setq) 
      ,var ,@args)) 

Die beabsichtigte Ausgabe wollte

(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) 

ist aber mein definiert Makro funktioniert nicht besonders , wenn ich auf Null binded ist Sie jemand Ahnung, was ist das Problem mit diesem Makro?

Antwort

3

Die Bestimmung, ob setq oder nconc verwendet werden soll, erfolgt zur Zeit der Makroerweiterung, nicht zur Laufzeit. Dies ist ein kleines Problem. Es gibt auch einige Probleme mit Ihrem Backquote-Ausdruck, da es entweder ein "," zu viele (in (null ,var)) oder ein zu wenig (in (boundp var), mit der Notwendigkeit für eine andere Backquote) gibt.

Unten finden Sie zumindest etwas eine funktionierende Lösung nähern, die Wahl des Verwendens setq oder nconc bis zur Laufzeit zu verzögern:

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

Auch beachten Sie, dass diese mit einer Liste nach und nach aufbauen müssen mehr- oder weniger O (n^2) Verhalten, es ist in der Regel schneller, durch consing zu akkumulieren, dann (falls erforderlich) eine Umkehrung am Ende durchzuführen.

+0

Ja, es funktioniert, Vielen Dank! Ich werde es auch bald mit consing versuchen. – Sharad

Verwandte Themen