2011-12-03 10 views
8

La macro Noirdefpage mi sta dando un po 'di problemi. Sto cercando di costruire una chiamata simile a questo:La variabile trasmessa alla macro viene risolta in uno spazio dei nomi errato?

(defpage [:post "some/url"] [data] 
    ;; some stuff... 
) 

Tuttavia, invece di utilizzare la parola chiave :post Vorrei utilizzare una variabile, in questo modo:

(def my-method :post) 
(defpage [my-method "some/url"] [data] 
    ;; some stuff... 
) 

Il problema è che quando il macro si espande, si vuole risolvere la variabile my-method nel compojure.core namespace al posto della mia, dandomi l'errore:

No such var: compojure.core/MY-METHOD 

Come c un I force my-method da risolvere nel contesto corrente?

risposta

1

Immagino che questo sia un problema simile a: How can I apply clojure's doc function to a sequence of functions Una macro può fare tutto ciò che vuole con i suoi argomenti, quindi passare un simbolo nudo può causare risultati imprevedibili.

Un modo per risolverlo, ma non è abbastanza:

(eval (list 'defpage (vector my-method "some/url") '[data] 
    ; some stuff 
)) 

Si noti che il mio metodo non è un letterale qui, quindi viene risolto e valutati nel nostro spazio dei nomi prima, prima di andare in eval.

0

Che dire di passare il mio metodo con spazio dei nomi è in:

(defpage [myns/my-method "some/url"] [data] 
;; 
) 
+0

Ho provato, ma non sembra funzionare. – benekastah

1

Sembra, che noir non è pensato per essere utilizzato in questo modo, perché ci vuole l'argomento metodo e lo trasforma al simbolo in compojure.core (vedere https://github.com/ibdknox/noir/blob/master/src/noir/core.clj#L36). Significa che non si aspetta una variabile in questo posto, solo letterali. Quindi non penso che tu possa fare qualcosa a riguardo, tranne inviare un problema a noir ...

1

Se guardiamo attraverso il file noir/core.clj (source), troviamo la funzione parse-route e la ragione su cosa fa con il suo argomento del metodo (si chiama azione lì), potremmo trovare che la parola chiave del metodo viene convertita in stringa , uppercased e risolto nel namespace compojure.core. Tutto questo viene fatto durante il tempo di espansione della macro. Quindi non è possibile utilizzare variabili anziché parole chiave senza alterare il codice noir.

Problemi correlati