2011-12-03 4 views
8

Noir मैक्रो defpage मुझे थोड़ा परेशानी दे रहा है।मैक्रो को पारित परिवर्तनीय गलत नामस्थान में हल हो जाता है?

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

हालांकि कीवर्ड :post उपयोग करने के बजाय मैं इस तरह एक चर का उपयोग करना चाहते हैं,: मैं एक कॉल इस के समान निर्माण करने के लिए कोशिश कर रहा हूँ

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

समस्या यह है कि जब

No such var: compojure.core/MY-METHOD 

कैसे c: मैक्रो फैलता है, यह मेरे त्रुटि दे रही है, मेरे अपने के बजाय compojure.core नाम स्थान में चर my-method को हल करना चाहता है वर्तमान संदर्भ में हल करने के लिए मैं my-method को मजबूर करता हूं?

उत्तर

1

मुझे लगता है कि यह एक समान समस्या है: How can I apply clojure's doc function to a sequence of functions एक मैक्रो अपने तर्कों के साथ जो कुछ भी चाहता है वह कर सकता है, इसलिए गुजर रहा है एक नग्न प्रतीक के परिणामस्वरूप अप्रत्याशित परिणाम हो सकते हैं।

एक तरह से इसे हल करने के लिए, लेकिन यह बहुत नहीं है:

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

सूचना है कि मेरे-विधि एक शाब्दिक यहाँ नहीं है, इसलिए इसका समाधान नहीं होता है और पहले अपने स्वयं के नाम स्थान में मूल्यांकन किया जाता है, में जाने से पहले eval।

0

नाम स्थान के साथ साथ मेरी-विधि गुजर के बारे में उस में क्या है:

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

मैंने कोशिश की, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा था। – benekastah

1

ऐसा लगता है, कि नॉई इस तरह से इस्तेमाल किया जा करने के लिए नहीं है, क्योंकि यह विधि तर्क लेता है और प्रतीक करने के लिए इसे बदल देती है compojure.core में (https://github.com/ibdknox/noir/blob/master/src/noir/core.clj#L36 देखें)। इसका मतलब है, कि यह इस जगह में एक चरक की अपेक्षा नहीं करता है, केवल अक्षर। इसलिए मुझे नहीं लगता कि आप इसके बारे में कुछ भी कर सकते हैं, नोयर को कोई समस्या पोस्ट करने के अलावा ...

1

यदि हम नोयर/कोर.क्लज फ़ाइल (source) देखते हैं, तो पार्स-रूट फ़ंक्शन ढूंढें और इसके विधि तर्क के साथ क्या करें (इसे वहां क्रिया कहा जाता है), हम पाते हैं कि विधि कीवर्ड स्ट्रिंग में परिवर्तित हो गया है , compojure.core नामस्थान में uppercased और हल किया गया। यह सब मैक्रो विस्तार समय के दौरान किया जाता है। इसलिए नोयर कोड को बदलने के बिना कीवर्ड के बजाय वैरिएबल का उपयोग करना संभव नहीं है।

संबंधित मुद्दे