मुझे पता है कि क्लोजर में अज्ञात फ़ंक्शन "नामकरण" के लिए वाक्य रचनात्मक समर्थन है, जैसा कि अन्य उत्तरों ने इंगित किया है। हालांकि, मैं प्रश्न को हल करने के लिए एक प्रथम सिद्धांत दृष्टिकोण दिखाना चाहता हूं, जो प्रोग्रामिंग भाषा पर विशेष वाक्यविन्यास के अस्तित्व पर निर्भर नहीं है और यह पहली ऑर्डर प्रक्रियाओं (लैम्बडास) वाली किसी भी भाषा पर काम करेगा।
सिद्धांत रूप में, यदि आप एक पुनरावर्ती समारोह कॉल करना चाहते हैं, तो आप फ़ंक्शन का नाम तो "गुमनाम" का उल्लेख करने की जरूरत है (यानी बेनाम कार्यों) एक प्रत्यावर्तन के प्रदर्शन के लिए इस्तेमाल नहीं किया जा सकता है ... जब तक आप Y-Combinator का उपयोग करते हैं। Here यह एक स्पष्टीकरण है कि यह क्लोजर में कैसे काम करता है।
मुझे आपको दिखाएं कि इसका उपयोग उदाहरण के साथ कैसे किया जाता है। सबसे पहले, एक Y-Combinator
तर्क के परिवर्तनशील साथ कार्यों के लिए काम करता है कि:
(defn Y [f]
((fn [x] (x x))
(fn [x]
(f (fn [& args]
(apply (x x) args))))))
अब, गुमनाम समारोह है कि power
प्रक्रिया के रूप में प्रश्न में परिभाषित लागू करता है। जाहिर है, यह एक नाम नहीं है, power
सबसे बाहरी कार्य करने के लिए केवल एक पैरामीटर है:
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1))))))
अंत में, यहाँ कैसे गुमनाम power
प्रक्रिया को Y-Combinator
लागू करने के लिए, पैरामीटर के रूप में पारित करने है number=5
और exponent=3
(यह नहीं है पूंछ पुनरावर्ती BTW):
((Y
(fn [power]
(fn [number exponent]
(if (zero? exponent)
1
(* number (power number (- exponent 1)))))))
5 3)
> 125
स्रोत
2012-05-07 23:40:24
धन्यवाद जेरेमी, मुझे नाम विकल्प के बारे में पता नहीं था। मैं [4clojure] (http://www.4clojure.com/) प्रश्नों के माध्यम से काम कर रहा हूं और वे defn की अनुमति नहीं देते हैं। टेल रिकर्सन स्पष्ट रूप से बेहतर है, लेकिन मैं दौड़ने से पहले चलना चाहता हूं :) –