identity
"इसकी तर्क वापस करें"?
यह निर्भर करता है कि तर्क द्वारा आपका क्या मतलब है।
- यदि यह है समारोह कॉल प्रपत्र में मूल्यांकन अभिव्यक्ति, तो हमेशा नहीं।
- यदि यह है तो फ़ंक्शन का शरीर प्रविष्टि पर स्टैक पर देखता है, तो हाँ, यह करता है।
क्लोजर फ़ंक्शन कॉल करने के तरीके के कारण विसंगति उत्पन्न होती है।
- क्लोजर फ़ंक्शन वे ऑब्जेक्ट्स हैं जो the
IFn
interface का अनुपालन करते हैं।
- एक क्लोजर फ़ंक्शन कॉल फ़ंक्शन ऑब्जेक्ट के - arity के लिए अधिभारित कई
invoke
विधियों में से एक में अनुवाद करता है।
invoke
विधियों में से Object
पैरामीटर हैं। long
Long
में, और इतने पर: पुरातन है, जो इसी जावा वर्ग में लिपटे रहे हैं को छोड़कर एक पहचान आपरेशन -
इस सब का नतीजा हर Clojure समारोह कॉल अपने Object
किसी तरह का में हर तर्क में अनुवादित करती है ।
तो identity
फ़ंक्शन, अनिवार्य रूप से (defn identity [x] x)
, एक आदिम तर्क नहीं देता है। यह नहीं कर सकता, क्योंकि यह इसे कभी नहीं देखता है।
उदाहरण के लिए, अभिव्यक्ति
(inc 3)
संख्या 3
निश्चित रूप से एक long
है पर विचार करें। (inc 3)
किस प्रकार का है? के Clojure पूछते हैं:
(type (inc 3))
=> java.lang.Long
... एक बॉक्सिंगLong
वस्तु।
हैंग पर, कर रहे हैं हम यह सुनिश्चित करें कि 3
एक आदिम long
है:
(type 3)
=> java.lang.Long
Aaaaaaagh! यह भी बॉक्स किया गया है!
आवश्यक नहीं! आप यह नहीं बता सकते हैं, क्योंकि उस समय तक type
3
देखता है, यह बॉक्स किया गया है, चाहे वह पाठक/कंपाइलर के लिए था या नहीं। Clojure documentation बिंदु पर चुप है। यह सिर्फ इतना कहता है कि संख्यात्मक अक्षर आमतौर पर जावा के अनुसार दर्शाए जाते हैं।
तो - सामान्य रूप में - यह मूल्यांकन तंत्र, नहीं (जैसे identity
के रूप में) एक विशेष कार्य है कि मुक्केबाजी आदिम तर्क के लिए जिम्मेदार है। यह ऑटो मुक्केबाजी है।
(let [x 1.0] (identical? x x)) ;=> false
(let [x (identity 1.0)] (identical? x x)) ;=> true
तथ्य यह है कि identical?
1.0
के दो boxings के बीच भेद करने में सक्षम है यह है कि पता चलता है:
क्या आपके उदाहरण से पता चलता है कि इस तरह के पुरातन, अन-बॉक्सिंग, कम से कम let
रूपों में के रूप में आयोजित किया जाता है एक प्राइमेटिव double
के रूप में आयोजित किया जाता है। (मैंने एक सामान्य double
का उपयोग किया है, यह दिखाने के लिए कि व्यवहार विशेष मान Double/NaN
के साथ कुछ भी करने के लिए नहीं है)।
अब एक वर में नंबर डालने की कोशिश करते हैं:
(def x 1.0)
(identical? x x) ;=> true
(let [x (identity x)] (identical? x x)) ;=> true
यह बॉक्सिंग रहा है।
(identical? x (identity x)) ;=> true
ऊपर Alan Thompson's और Josh's जवाब और एलन Malloy की और ली की टिप्पणी क्या शामिल करने के लिए थोड़ा जोड़ता है:
हम यहां हैं, तो स्वत: मुक्केबाजी idempotent है। मैंने महसूस किया कि उन्होंने वास्तव में इसे लैंड किए बिना मछली को झुकाया और खेला था।
यह शायद मुक्केबाजी के कारण है - 'डबल/नाएन' एक प्राचीन 'डबल' देता है जिसे पहले उदाहरण में दो बार बॉक्स किया जाता है लेकिन केवल एक बार में। – Lee