2010-12-16 7 views
4
verfügbar

ich einen Makro DBTEST haben will, die wie folgt verwendet werden können:Wie Variablen in einem Makro definieren, so dass sie für den Anrufer des Makros

sollte
(dbtest 
    (prn test-object1) 
    (prn test-object2)) 

Test-object1 und Test-object2 sein Variablen, die durch dbtest definiert sind (weil ich sie jedes Mal brauche, wenn ich das Makro dbtest benutze). "prn" ist nur ein Beispiel; Ich möchte beliebigen Code innerhalb des Makros verwenden.

ich versuchte, das:

(defmacro dbtest [& body] 
    `(sql/with-connection db 
    (delete-all-tables) 
    (let [~'test-object1 (insert-object "foo")] 
     [email protected]))) 

wo insert-Objekt eine Funktion ist, die etwas in die DB ein und gibt eine die entsprechende Datenstruktur.

Aber es funktioniert nicht: Ich erhalte eine „nicht so var“ Fehler

+0

Übrigens glaube ich, dass die Variablen, die du definierst, _anaphora_ heißen, wie "es" in diesem Satz: Ich mag Schokolade, obwohl es mich fett macht. – Ralph

Antwort

5

Es funktioniert für mich:

user=> (defmacro let-test [& body] 
     `(let [~'test-object1 123] [email protected])) 
#'user/let-test 
user=> (let-test (+ test-object1 321)) 
444 

Sind Sie sicher, dass das Problem nicht mit den SQL-bezogene Anrufe ?

+0

Thx! Du hast recht, es war ein ganz anderes Problem; Ich war nur verwirrt von dem Fehler. jetzt behoben :-) – qollin

Verwandte Themen