2011-03-28 14 views
6

compojure library in the core namespace में, मुझे निम्न प्रपत्र दिखाई देता है:क्लोजर: # '/ (var ...) फॉर्म का उपयोग क्या है?

(defn- compile-route 
    "Compile a route in the form (method path & body) into a function." 
    [method route bindings body] 
    `(#'if-method ~method 
    (#'if-route ~(prepare-route route) 
     (fn [request#] 
     (let-request [~bindings request#] 
      (render (do [email protected]) request#)))))) 

और

(defmacro GET "Generate a GET route." 
    [path args & body] 
    (compile-route :get path args body)) 

फ़ाइल में आगे, if-method और if-route फ़ंक्शन defn- s के साथ परिभाषित किए गए हैं।

हालांकि मैं इस compile-route फ़ंक्शन में #' के अर्थ को समझ नहीं पा रहा हूं। Xzx47 के लिए दस्तावेज़ कहते हैं:

प्रतीक को एक var को हल करना होगा, और Var ऑब्जेक्ट स्वयं (उसका मान नहीं) वापस कर दिया जाएगा। पाठक मैक्रो # एक्स एक्स (var x) तक फैलता है।

लेकिन मेरे लिए, क्या हो रहा है (यानी डिफैक्रो से कहा जा रहा है) के संदर्भ में, ऐसा लगता है कि इसका मतलब है कि प्रतीक का मूल्य वापस कर दिया जाएगा, जो वही है जो प्रतिस्थापन की तरह लगता है :

(def x 5) 
(+ x 7) 
-> 12 

यानी, (+ x 7) विस्तारित है, या (+ 5 7)

जैसा है, मैं यहां क्या खो रहा हूं?

उत्तर

4

थोड़ी देर के लिए इस को देखने के बाद, मैं यह तथ्य यह है कि if-method और if-route कार्य हैं के साथ क्या करना है कि कुछ शक करने के लिए शुरू कर वास्तव में निजी ((defn- if-route ...))।

इसके अलावा, मैक्रो के लिए, जब आप वापस टिक उद्धरण ("` ") आप वास्तव में अंतिम विस्तार में पूरी तरह से नाम स्थान निर्दिष्ट प्रतीक हो रही है कार्य करें:

`(+ 2 3) 

का विस्तार होगा
(clojure.core/+ 2 3) 

चूंकि ये विधियां निजी हैं, इसलिए वे सामान्य विस्तार में पहुंच योग्य नहीं होंगे, इसलिए इस कार्य को वास्तविक कार्य के संदर्भ में रखने वाले प्रतीक को प्राप्त करने के लिए विभिन्न कार्यों का उपयोग किया जाता है, विस्तार।

+1

यह बिल्कुल कारण है। – kotarak

+0

पुष्टि के लिए धन्यवाद! –

+0

एक और टिप्पणी: प्रतीक संदर्भ नहीं रखते हैं। वर्स करते हैं। यह लिस्प, IIUC के लिए एक अंतर है। प्रतीक केवल नाम हैं और संकलक द्वारा वर्स को हल कर रहे हैं। कोड काम करता है, क्योंकि वारा उस चीज़ को सभी '.invoke' कॉल को प्रतिनिधि करता है। – kotarak

3

ring-reload उन फ़ाइलों से भिन्न परिभाषाओं को फिर से लोड कर सकता है जिन्हें आप विकास के दौरान संशोधित करते रहते हैं। चूंकि आप एक (var ...) पर जाते हैं, हर बार जब आप इसे पढ़ने का प्रयास करते हैं, तो इसे हल किया जाता है, और इसके परिणामस्वरूप पुनः लोड किए गए वर्रों को प्रत्येक अनुरोध पर दोबारा पढ़ा जा सकता है। यह इंटरेक्टिव वेब विकास (संकलन आदि की आवश्यकता के बिना) की ओर जाता है। यदि आप (var ...) का उपयोग नहीं करते हैं और इसके बजाय सीधे मूल्य पास करते हैं तो रीलोडेड वर्र्स अंगूठी यूआरआई हैंडलर को पास नहीं किए जाएंगे और इसलिए आप बस नहीं कर सकते अपना कोड संशोधित करें और चलाएं।

चेक उदाहरण के लिए इस ब्लॉग प्रविष्टि:

http://charsequence.blogspot.com/2010/09/interactive-web-development-with.html

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