2012-01-11 13 views
8

मैं पल में छल योजना सीख रहा हूँ, और दस्तावेज में मैं अचानक निम्नलिखित निर्माण में भाग:एक "बेयर" औपचारिक पैरामीटर के साथ लैम्ब्डा परिभाषा का उपयोग कब करें?

((lambda args (display args)) 42) 
=> (42) 

यह मैं एक पाश के लिए फेंक दिया; इस बिंदु तक मैं था ग्रहण औपचारिक पैरामीटर हमेशा एक सूची में संलग्न गया:

((lambda (args) (display args)) 42) 
=> 42 

मुझे आश्चर्य है कि जब इस प्रकार का उपयोग करने के लिए, और यह कैसे बहस के चर संख्या के लिए डॉट नोटेशन से अलग है। - शायद अधिक जटिल उदाहरण के लिए -

((lambda args (display args)) 1 2 3)  => (1 2 3) 
((lambda (. args) (display args)) 1 2 3) => (1 2 3) 

एक अंतर है कि मैं के बारे में पता करने की आवश्यकता है और वहाँ एक दूसरे के ऊपर पसंद करते हैं के लिए किसी भी कारण है: विशेष रूप से, क्या दो निम्नलिखित वेरिएंट के बीच का अंतर है?

+3

बोनस के रूप में, 'सूची' की परिभाषा 'है (सूची परिभाषित करें (लैम्ब्डा xx))'। – erjiang

उत्तर

6

अंतर यह है कि इस संस्करण args नामक केवल एक पैरामीटर, मामलों के लिए उपयोगी प्राप्त करता है जब आप वास्तव में वास्तविक lambda फार्म के लिए उम्मीद तर्क की संख्या पता है:

(lambda (args) (display args)) 

और इस संस्करण एक संभवतः प्राप्त करता है (खाली) सूची मापदंडों के, args कहा जाता है, उपयोगी है जब आप lambda फार्म के लिए तर्क के परिवर्तनशील उम्मीद:

(lambda args (display args)) 
(इसलिए यह बचा जाना चाहिए) ५३६९१३६३२१०

निम्नलिखित दो संस्करणों के बीच कोई अंतर नहीं होनी चाहिए, लेकिन जब से यह बिंदु से पहले हिस्सा गायब नहीं सभी व्याख्याकार दूसरा एक को स्वीकार करेंगे,:

(lambda args (display args)) 
(lambda (. args) (display args)) 

निम्नलिखित संस्करण है उपयोगी जब आप यह निर्दिष्ट करना चाहते हैं कि lambda फ़ॉर्म में एक या अधिक अनिवार्य पैरामीटर (डॉट के बाईं ओर प्रतीकों) और शून्य या अधिक वैकल्पिक पैरामीटर (डॉट के दाईं ओर एक एकल प्रतीक) की सूची है:

(lambda (mandadory1 mandatory2 . optional) (display mandatory1)) 
+3

'(। Args)' मान्य नहीं है योजना पढ़ा वाक्यविन्यास। हालांकि, गुइल अपने पाठक को 'तर्क' के रूप में पढ़ने के लिए विस्तारित प्रतीत होता है। यह निश्चित रूप से पोर्टेबल नहीं है और, जैसा कि आप कहते हैं, सबसे अच्छा बचा है। –

+1

उत्कृष्ट, धन्यवाद। मैंने सोचा और कोई दुसरा तरिका होगा; माना जाता है कि डॉट-ओन फॉर्म पूरी तरह से मानक था और "नंगे" रूप थोड़ा अजीब था। मुझे लगता है कि डॉट फॉर्म मेरे शुरुआती आंखों के लिए अन्य रूपों से अधिक स्वाभाविक रूप से पालन करता है। – Janne

1

यह मुझे अल के लिए फेंक दिया OOP; इस बिंदु तक मैं मान लिया औपचारिक पैरामीटर हमेशा एक सूची में संलग्न किया गया था:

ध्यान दें कि (a . args) और (a b . args) तरह बातें नहीं कर रहे हैं वास्तव में या तो सूचीबद्ध करता है। (a . args) एक जोड़ी है जहां car प्रतीक a है और cdr प्रतीक args है। (a b . args) एक जोड़ी है जहां car प्रतीक a और cdr है (एक जोड़ी जहां car प्रतीक b है और cdr प्रतीक args है)। यह थोड़ी देर के लिए एक सूची की तरह दिखता है, a और b और उसके साथ, लेकिन क्योंकि यह शून्य/खाली सूची में समाप्त नहीं होता है, यह वास्तव में एक उचित सूची नहीं है। इस तरह के संरचनाओं को अक्सर अनुचित सूचियों कहा जाता है। यदि आप चाहते हैं, तो आप बिंदीदार-जोड़ी अंकन here के बारे में थोड़ा पढ़ सकते हैं, या कहीं और ...

(. args) साथ

मैं शायद की तरह "यह एक जोड़ी जहां cdr प्रतीक args है कि" कुछ कहना चाहते हैं।या हो सकता है कि यह "एक जोड़ी" car है और cdrargs "जैसा होगा। किसी भी तरह से यह बहुत समझ में नहीं आता है, और, क्रिस जेस्टर-यंग ने कहा, यह वास्तव में वैध योजना नहीं है।

तो। (a b . args) जैसी चीजें केवल 0-में शून्य नहीं होने वाली चीज़ों को रखने के लिए नियमित रूप से बिंदीदार जोड़ी नोटेशन हैं। यदि योजना में औपचारिक पैरामीटर-चीज उन अनुचित सूचियों में से एक या उचित सूची या सिर्फ एक प्रतीक हो सकती है, तो औपचारिक मानकों की परिभाषा-चीज कुछ ऐसी होनी चाहिए: एक औपचारिक पैरामीटर-चीज शून्य, प्रतीक होना चाहिए, या एक जोड़ी जहां car एक प्रतीक है और cdr एक औपचारिक पैरामीटर-चीज है।

(जो मुझे लगता है कि एक अच्छी चीज है जो पैरामीटर के तर्कों को बाध्य करने के बजाय एक शानदार तरीका बनाती है। जैसे, आप औपचारिक मानकों को देखते हैं, और यदि यह प्रतीक है तो आप तर्कों की सूची को बाध्य करते हैं और यदि यह एक जोड़ी है तो आप औपचारिक पैरामीटर-चीजों के cdr पर के तर्कों के car को बाध्य करते हैं और औपचारिक पैरामीटर-चीज/तर्क (ओह और यदि यह शून्य है तो आप ऐसा या कुछ ऐसा कर रहे हैं) के cdr पर पुनरावृत्ति करते हैं। मुझे आम लिस्प के तरीके से थोड़ी सी सुंदरता के रूप में हमला करता है "और यदि car में प्रतीक &rest है तो आप इसके बाद के प्रतीकों के बाकी तर्कों को बाध्य करते हैं।"

+0

बिंदीदार जोड़ी - मैंने कभी कनेक्शन नहीं बनाया। सोचा यह औपचारिक पैरामीटर विनिर्देश के लिए विशिष्ट संकेत था। धन्यवाद; मेरे पास अवसर होने पर मैं अपने प्रश्न को संपादित करूंगा। – Janne

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