2011-12-03 18 views
8

Noir makro defpage bana biraz sıkıntı veriyor. Böyle bir değişken kullanmak istiyorum yerine anahtar kelimeyi :post kullanmak yerine, AncakDeğişken geçirilen makro yanlış ad alanında mı çözülür?

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

: Ben buna benzer bir çağrı inşa etmeye çalışıyorum

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

sorun olduğunda

No such var: compojure.core/MY-METHOD 

Nasıl c: makro genişlediğinde, bana hata veren yerine kendime ait compojure.core ad değişken my-method çözmek istiyor Geçerli bağlamda çözmek için my-method'u zorlayabiliyorum?

cevap

1

Bu benzer bir sorun olduğunu tahmin ediyorum: How can I apply clojure's doc function to a sequence of functions Bir makro, onun args ile istediği her şeyi yapabilir Çıplak bir sembol öngörülemeyen sonuçlara yol açabilir.

bir yolu bunu çözmek için, ama oldukça değildir: my-yöntem burada bir hazır değil

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

Bildirim, bu yüzden girmeden önce çözülmesi ve öncelikle kendi ad değerlendirildi alır eval.

0

ad ile birlikte my-yöntemi geçirilmesi konusunda içinde bulunduğu Ne:

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

Bunu denedim, ancak işe yaramadı. – benekastah

1

O yöntem argüman alır çünkü noir, bu şekilde kullanılacak anlamına gelmez, görünüyor ve sembole dönüştürür compojure.core'da (bakınız https://github.com/ibdknox/noir/blob/master/src/noir/core.clj#L36). Bu, bu yerde bir değişken beklemediği anlamına gelir, sadece literals. Bu yüzden, bu konuda herhangi bir şey yapamayacağınızı düşünmüyorum ...

1

Eğer noir/core.clj dosyasından bakarsak (source), parse-route fonksiyonunu bulup metod argümanı ile ne yaptığına dair bir sebep bulun (burada eylem denir), bu metod anahtarının dizgeye dönüştüğünü bulabiliriz. , upperjed ve componentjure.core ad alanında çözümlendi. Tüm bunlar makro genişletme süresi boyunca yapılır. Bu nedenle, noir kodunu değiştirmeden anahtar kelime yerine değişken kullanmak mümkün değildir.