2010-04-30 12 views
5

कुछ समय पहले यह कोड काम करने लग रहा था, लेकिन अब यह और नहीं है। क्या इसमें कुछ गड़बड़ है?Sum function काम नहीं करता है:/

user=> (defn sum [a b] (a + b)) 
#'user/sum 
user=> (sum 3 4) 
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0) 
user=> 

यह शायद एक ब्रेक :)

उत्तर

9

लेने के लिए समय आ गया है शायद कोशिश:

(defn sum [a b] (+ a b)) 

Clojure, लिस्प परिवार के एक सदस्य होने के नाते, हमेशा उपसर्ग अंकन गणित भाव के लिए उपयोग करता है।

+0

हाँ, मैं भूल गया। – StackedCrooked

2

चूंकि आप इस तरह के एक समारोह को लिखने की कोशिश कर रहे हैं, मुझे आश्चर्य है कि + यह इंगित करने में मददगार हो सकता है कि क्लोजर में केवल एक नियमित कार्य है, क्योंकि यह किसी अन्य लिस्प में है। वास्तव में, क्लोजर में कोई विशेष "अंकगणितीय अभिव्यक्ति" नहीं है, केवल उन अनुप्रयोगों को कार्य करें जिनके तर्क संख्याएं हैं और जिनके ऑपरेटर अंकगणितीय परिचालन करते हैं।

असल में, अधिकांश लिस्पस में सिंटैक्स के विशिष्ट टुकड़ों के अर्थ में कोई विशेष "ऑपरेटर" नहीं होते हैं, जिन्हें फ़ंक्शन के रूप में उपलब्ध होने के लिए उनकी कार्यक्षमता के लिए लपेटने की आवश्यकता होती है। इस संबंध में क्लोजर एक लिस्प के रूप में असामान्य है जिसमें यह स्पष्ट रूप से कुछ मूलभूत सुविधाओं के लिए अपने मेजबान मंच पर निर्भर करता है; जैसे वर्ग की pow विधि के रूप में वेनिला क्लोजर में फ्लोटिंग-पॉइंट एक्सपोनेंटिएशन उपलब्ध है (लेकिन को clojure.core में विभिन्न अंकगणितीय ओप करने के लिए कुछ अच्छे कार्यों के लिए देखें।

क्लोज़र में जावा विधियों को फ़ंक्शन के रूप में उपयोग करने के लिए लपेटना होगा (उदाहरण के लिए map इत्यादि), इस तरह वे सी, पायथन या वास्तव में जावा जैसी भाषाओं से ऑपरेटरों को दिमाग में ला सकते हैं। हालांकि, उन्हें अभी भी उपसर्ग नोटेशन का उपयोग करने के लिए बुलाया जाता है।

2
  • clojure.core में पहले से ही एक + फ़ंक्शन है, इसलिए इसे फिर से परिभाषित करते समय बहुत सावधान रहें, आप शायद इससे बचने से बेहतर हैं।
  • क्लोजर सहित सभी लिस्पस उपसर्ग नोटेशन का उपयोग करते हैं। आपको (fn-name args) जैसे फ़ंक्शन को कॉल करना चाहिए। आपके उदाहरण में क्लोजर एक इंटीजर को फ़ंक्शन के रूप में कॉल करने का प्रयास करता है, क्योंकि यह सूची का पहला तत्व है। इंटीग्रर्स आईएफएन इंटरफ़ेस को लागू नहीं करते हैं, ताकि त्रुटि संदेश समझाया जा सके।
  • वास्तव में आप फ़ंक्शन का उपयोग करके गणितीय कार्यों के लिए एक इंफिक्स नोटेशन प्राप्त कर सकते हैं। इस समारोह के लिए जॉय ऑफ क्लोजर के पहले अध्याय के पृष्ठ 13 को यहां देखें, यहां आसानी से उपलब्ध है: http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf
+0

भले ही वह विशेष इंफिक्स उदाहरण इसे अंतिम मसौदे में नहीं लाएगा, मुझे ध्यान रखना चाहिए कि इसे एक समारोह के रूप में लागू किया गया था, मैक्रो नहीं। – fogus

+0

@fogus ने संगत रूप से संपादित किया। –

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