2012-01-19 13 views
23

इसलिए मैंने सोचा कि एक फ़ंक्शन का नाम देना एक अच्छा विचार होगा जो घातीय ^ की गणना करता है, लेकिन ऐसा लगता है कि कैरेट वास्तव में कुछ खास करता है, क्योंकि क्लोजर आरईपीएल '^ का मूल्यांकन करते समय त्रुटि उत्पन्न करता है। गुगलिंग ने मुझे this दिया, इसलिए मैं सोच रहा था कि क्लोजर में कैरेट के लिए वास्तविक उपयोग क्या है।क्लोजर कैरेट प्रतीक के रूप में?

(इसके अलावा, यह करने के बाद सभी एक समारोह ^ नाम के लिए संभव हो सकता है?)

उत्तर

32

^ है "मेटा चरित्र" यह the reader बताता प्रतीक ^ अगले प्रतीक को मेटाडाटा के रूप में के साथ शुरू जोड़ने के लिए (यह प्रदान की

012: कुछ है कि IMetas लागू करता है)

user=> (def x ^:IamMeta [1 2 3]) 
#'user/x 
user=> x 
[1 2 3] 
user=> (meta x) 
{:tag :IamMeta} 
user=> 

आप चीजों की meta को देखकर हुड के नीचे कैसे clojure काम करता है के बारे में बहुत कुछ सीख सकते हैं, उदाहरण के कार्यों के लिए है

user=> (meta foo)       
{:ns #<Namespace user>, 
:name foo, :file "NO_SOURCE_PATH", 
:line 5, :arglists ([s])} 

इस बहुत बार के लिए type hints

(defn foo [^String s] (.charAt s 1)) 

यह आम तौर पर एक अच्छा विचार किया जाता है (set! *warn-on-reflection* true) प्रतिबिंब चेतावनी को चालू करना और तब तक चेतावनी चले जाओ प्रकार संकेत जोड़ने के लिए है। इन क्लोजर के बिना रन-टाइम पर फ़ंक्शन ऑपरेंड के प्रकार को देखेंगे, जो आपको थोड़ी सी कीमत पर टाइप के साथ परेशान करने की परेशानी बचाता है।

पुनश्च: मेरा अगला पसंदीदा पाठक चरित्र, "प्रेषण" चरित्र # है इसके लायक अगले :)

पी पी एस यह के बारे में सीखने है: इस clojure 1.2.x बनाम clojure 1.3.x में में अलग है Clojure 1.2.1 मेटाडाटा रचना नहीं होती जब आप मेटा-चरित्र का उपयोग करें:

user=> (def foo ^:foo ^:bar [1 2 3]) 
#'user/foo 
user=> (meta foo) 
{:tag :foo} 

और 1.3 में यह "सही काम करता है" और यह भी कीवर्ड "टैग" के बजाय विकल्प हैं:

user=> (def foo ^:foo ^:bar [1 2 3]) 
#'user/foo 
user=> (meta foo) 
{:foo true, :bar true} 
+0

यह बिल्कुल "प्रतीक जोड़ें" नहीं है। प्रतीक एक प्रकार int के लिए शॉर्ट-कट है। लेकिन यह तारों के साथ भी काम करता है, उदाहरण के लिए। '^" बी [ "'। कीवर्ड विकल्पों में अनुवादित हैं, उदाहरण के लिए। '^: foo' को' {: foo true} 'में बदल दिया गया है। और अंत में आप एक मानचित्र स्वयं निर्दिष्ट कर सकते हैं, उदाहरण के लिए। '^ {: टैग स्ट्रिंग: foo true: bar: baz}'। – kotarak

+0

अच्छा बिंदु कोटरक, हमें यह भी उल्लेख करना चाहिए कि मेटाडाटा क्लोजर के विभिन्न संस्करणों में अलग-अलग रचना करता है और मेरा मानना ​​है कि 1.3 कांटेदार मेटाडाटा को कॉपी करना शुरू होता है^^ foo ^: bar [1 3 4] ' –

0

ऐसा लगता है कि आपके प्रश्न का उत्तर दुर्भाग्य से, नहीं। क्लोजर में, आप फ़ंक्शन ^ नाम नहीं दे सकते।

user=> (println \^) 
^ 
nil 

इसका अर्थ है कि आप एक बैकस्लैश के साथ कैरेट (^) बच सकते हैं लगता है:

मैं आरईपीएल में निम्नलिखित की कोशिश की।

user=> (defn \^ [n e] (cond (= e 0) 1 :else (* n (\^ n (- e 1))))) 
IllegalArgumentException First argument to defn must be a symbol 
clojure.core/defn (core.clj:277) 

एक ही कोड एक नियमित पाठ नाम के साथ काम करता है::

user=> (defn exp [n e] (cond (= e 0) 1 :else (* n (exp n (- e 1))))) 
#'user/exp 
user=> (exp 3 3) 
27 

मैं अगर खुश होंगे हालांकि, अगर मैं एक समारोह के एक नाम के रूप में \^ का उपयोग कर की घोषणा करने की कोशिश तो मैं एक त्रुटि संदेश मिलता मेरे से बेहतर क्लोजर-फू वाला कोई व्यक्ति मुझे गलत साबित कर सकता है! :)

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