2010-05-31 10 views
6

योजना में, मैं परिभाषित/लैम्ब्डा शॉर्टैंड का उपयोग कैसे परिभाषित कर सकता हूं?योजना परिभाषित/लैम्ब्डा शॉर्टेंड

उदाहरण के लिए निम्नलिखित प्रक्रिया को देखते हुए ...

(define add 
    (lambda (num1 num2) 
    (+ num1 num2))) 

एक यह करने के लिए इसे छोटा कर सकते हैं:

(define (add num1 num2) 
    (+ num1 num2)) 


हालांकि, कैसे मैं निम्नलिखित जैसे काम करते छोटा कर सकते हैं?

(define makeOperator 
    (lambda (operator) 
    (lambda (num1 num2) 
     (operator num1 num2)))) 

;example useage - equivalent to (* 3 4): 
((makeOperator *) 3 4) 

उत्तर

13
(define (makeOperator operator) 
    (lambda (num1 num2) 
    (operator num1 num2))) 

दूसरा लैम्ब्डा छोटा नहीं किया जा सकता।

अच्छी तरह से आप (define (makeOperator operator) operator) पर इसे छोटा कर सकते हैं, अगर आप यह लागू नहीं करना चाहते हैं कि लौटा कार्य वास्तव में दो तर्क लेता है।

+0

धन्यवाद - मेरी वोट सीमा रीसेट होने के बाद मैं आपको +1 करूंगा :)। http://www.scheme.com/tspl2d/start.html#g1642 - यदि आप थोड़ा सा स्क्रॉल करते हैं, तो लेखक परिभाषित करने के लिए किसी प्रकार के डॉट सिंटैक्स के बारे में बात कर रहा है। कोई विचार है कि वह किस बारे में बात कर रहा है? – Cam

+2

@incrediman: हाँ, वह '(परिभाषित (एफ। Xs) ...) 'के बारे में बात कर रहा है, जो आपको तर्कों की मनमानी संख्या (जैसे' (एफ 1 2 3 4 5) ') के साथ एफ कॉल करने की अनुमति देगा और' xs' उन तर्कों वाली एक सूची होगी। – sepp2k

+0

अहह। गोचा - धन्यवाद। यह वास्तव में काफी उपयोगी है, इसलिए मुझे खुशी है कि मैंने पूछा :) – Cam

4

ऊपर जवाब के विपरीत, दूसरा lambda उपयोग कर सकते हैं आशुलिपि define अंकन:

(define (makeOperator operator) 
    (define (foo num1 num2) 
    (operator num1 num2)) 
    foo) 
+1

यह वास्तव में एक ही बात नहीं है। मेरे सरल शॉर्टेंड में, कोई अतिरिक्त चर घोषित नहीं किया जाता है, लेकिन यहां आप foo घोषित कर रहे हैं। इसलिए जब यह परिभाषित वाक्यविन्यास का उपयोग करता है, यह वास्तव में कम नहीं है। इसके अलावा यह lppda संस्करण से sepp2k से लंबा है।/अपेक्षाकृत अशिक्षित राय – Cam

+2

(ए) मैंने यह नहीं कहा कि यह छोटा है - केवल यह कि वह * शॉर्टेंड * 'परिभाषित 'फ़ॉर्म का उपयोग करता है जो आपने पूछा है; (बी) आपका सवाल यह था कि आंतरिक 'लैम्ब्डा' के लिए इस नोटेशन का उपयोग करना संभव है - जाहिर है, यह एक अतिरिक्त नाम के साथ आएगा क्योंकि यह वही है जो 'परिभाषित करता है': नाम के बिना इसका उपयोग करने का कोई तरीका नहीं है। –

+0

ओह, और बीटीडब्लू, यदि आपका लक्ष्य सिर्फ इसे कम करना है, तो sepp2k ने कहा है कि आप '(परिभाषित (मेकऑपरेटर ऑपरेटर) ऑपरेटर) का उपयोग कर सकते हैं, और यदि आप वास्तव में सभी तरह से जाना चाहते हैं:' (मेकऑपरेटर मूल्यों को परिभाषित करें) 'मोटे तौर पर वही है। –

6

योजना के कुछ कार्यान्वयन - छल की तरह और एमआईटी योजना (संस्करण 1.8 के साथ परीक्षण) - प्रदान आशुलिपि संकेतन निम्नलिखित:

(define ((foo x) y) (+ x y)) 

(foo 5) 
; => procedure 
((foo 5) 3) 
; => 8 

मेरा मानना ​​है कि इस अंकन Structure and Interpretation of Classical Mechanics में काफी एक बहुत कुछ किया जाता है।

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