2013-04-11 13 views
6

मैं स्ट्रिंग के स्रोत के माध्यम से देख रहा था? एफएन और कुछ सवाल थे।प्रश्न?

(def 
^{:arglists '([x]) 
    :doc "Return true if x is a String" 
    :added "1.0" 
    :static true} 
string? (fn ^:static string? [x] (instance? String x))) 
  1. क्या एक fn स्थिर मेटाडाटा कर दे करता है - नीचे string? fn का स्रोत है?
  2. स्थिर मेटाडेटा दो बार क्यों दिया जाता है, क्या यह इसे एफएन या var के लिए निर्दिष्ट करने के लिए पर्याप्त नहीं होना चाहिए?
  3. अनाम एफएन का नाम क्यों है?
+3

1. यहां उत्तर दिया गया था: http://stackoverflow.com/questions/7552632/what-does-static-do-in-clojure –

उत्तर

4

1. और 2. के उत्तरों के लिए, प्रश्न पर d.j.sheldrick की टिप्पणी देखें। उत्तर 3:

सबसे पहले, हालांकि यह यहां प्रासंगिक नहीं है, नामित फ़ंक्शंस स्वयं को उनके नाम से संदर्भित कर सकते हैं। यह उन्हें शीर्ष पर recur की बजाय सामान्य कॉल तंत्र के माध्यम से खुद को मूल्य के रूप में वापस करने या स्वयं को कॉल करने की अनुमति देता है। महत्वपूर्ण बात यह है कि यह आलसी seqs उत्पन्न कार्यों के लिए सही स्व-कॉल रणनीति है; मैं in an earlier SO answer के कारणों में गया हूं ("आप आलसी अनुक्रम में रिकर्सिव कॉल कैसे लपेट सकते हैं ..." ब्लॉक उद्धरण के बाद भाग देखें।

दूसरा, कार्यों को JVM कक्षाओं में संकलित किया गया है। कक्षाओं को नामस्थान पर आधारित क्लोजर कंपाइलर द्वारा नामित किया गया है जिसमें कार्य को परिभाषित किया गया है यदि फ़ंक्शन का नाम बदल दिया गया है; अन्यथा इस वर्ग का उपयोग कक्षा के लिए एक और सार्थक नाम उत्पन्न करने के लिए किया जाता है। यह डिबगिंग के लिए उपयोगी है, क्योंकि यह स्टैक निशान को अधिक समझदार बनाता है।