2009-06-03 4 views
6

मैं योजना सीख रहा हूं। नीचे दिए गए कोड में क्या गलत है? मैं एक ऐसा प्रोग्राम लिखना चाहता हूं जो सूची से पहला फ़ंक्शन लेता है और फिर उस नंबर पर लागू होता है?मैं योजना में किसी सूची से बेनामी फ़ंक्शन कैसे लागू करूं?

(define num 3) 

    ;;I want to do something like this which returns 3 
    ((λ (x) x)num) 

    ;;but my functions are in a list so this should return3 
    ((first '((λ (x) x) (λ (x) (* x x)))) num) 

इम ऊपर कोड के लिए यह त्रुटि मिलती:
प्रक्रिया आवेदन: उम्मीद प्रक्रिया, यह देखते हुए: (λ (x)); तर्क थे: 3

जब मुझे इन प्रकार के आउटपुट मिलते हैं तो इसका क्या अर्थ है?

जब मैं कुछ भी लागू नहीं करता हूं, तो मुझे एक अच्छा आउटपुट मिलता है।

(first '((λ(x) x)(λ(x) (*x x)))) 

रिटर्न (λ (x))

उत्तर

11

आप के हवाले कर रहे हैं, 'साथ लैम्ब्डा, तो यह मूल्यांकन नहीं किया जा रहा है।

यदि आप प्रॉम्प्ट पर केवल (λ (x) x) में फ़ीड करते हैं, तो DrScheme आपको #<procedure> दिखाता है, जिसका अर्थ है कि उसने वास्तव में लैम्ब्डा का मूल्यांकन किया है, और आपको एक बंद करने दिया है। इसे उद्धृत करके, आप केवल योजनाओं की एक सूची दे रहे हैं।

आप किसी सूची में अपने कार्यों रखना चाहते हैं, तो आप कर सकते हैं:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num) 

बोली आप एक सूची का निर्माण करने के, हाँ की अनुमति देता है, लेकिन एक जिनकी सामग्री का मूल्यांकन नहीं कर रहे हैं। सूची फ़ंक्शन का मूल्यांकन करने के बाद, अपने सभी तर्कों से एक सूची तैयार करता है।

तुम भी सूची quasiquote सकता है, यदि आप चाहें:

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num) 
+0

धन्यवाद। – unj2

2

इन भाव के बीच क्या अंतर है?

> (procedure? (lambda (n) n)) 
#t 
> (procedure? (quote (lambda (n) n))) 
#f 
> (procedure? '(lambda (n) n)) 
#f 

जय ने आपके लिए इसका उत्तर दिया लेकिन मैं अभी तक उसे ऊपर नहीं उठा सकता।

2

(लैम्ब्डा (एक्स) एक्स) एक प्रक्रिया नहीं है। यह एक प्रपत्र है कि एक प्रक्रिया में का मूल्यांकन करता है। लोग शब्दावली के साथ थोड़ा ढीला होते हैं और अक्सर लैम्ब्डा को एक प्रकार के शॉर्टेंड के रूप में एक प्रक्रिया कहते हैं। "सेसी n'est pas une पाइप।"

+0

सच है, लेकिन आखिरकार ऐसे मुद्दों से उलझन में आने वाले नए लोगों के लिए एक स्पष्टीकरण के रूप में बेकार। नोट बीटीडब्ल्यू कि तब से रैकेट ने मूल्यों को प्रिंट करने के तरीके को बदल दिया, जिसके परिणामस्वरूप एक स्पष्ट त्रुटि हुई: "..." अपेक्षित प्रक्रिया, दी गई: '(λ (x) x) '..." - उद्धरण नया है। –

+1

जब मैं नौसिखिया था तो यह वास्तव में वाक्य था जिसे मुझे भ्रम को दूर करने की आवश्यकता थी, इसलिए मैंने इसे दूसरों की मदद करने के लिए लिखा। शायद यह सब मेरे लिए सिर्फ "आखिरकार बेकार" है। – rptb1

+1

बात यह है कि योजना में कुछ (बहुत जानबूझकर!) कोड और डेटा, 'x' और' x 'के बीच भ्रम है, आपकी व्याख्या सही है (जैसा कि मैंने कहा) लेकिन यह मेटा स्तर पर एक समान प्रकार का भ्रम है, जहां 'x' डेटा है और" x * * के लिए मान "कोड" कोड है। कई छात्रों के लिए, इस प्रकार की द्वंद्व बहुत भ्रमित है, और जब तक वे मेटा-सर्कुलर मूल्यांकनकर्ता की तरह कुछ नहीं जाते हैं, तब तक ज्यादातर पूरी तरह से स्पष्ट नहीं होते हैं। –

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