क्या नाम के कार्यों को परिभाषित करने के लिए डुप्लिकेट सिंटैक्स एक खराब भाषा डिजाइन निर्णय है?


9

मैं मज़े के लिए एक प्रोग्रामिंग भाषा मॉडलिंग कर रहा हूं, और सिंटैक्स स्कैला से बहुत प्रभावित होता है - विशेष रूप से फ़ंक्शन परिभाषा।

मुझे एक डिज़ाइन समस्या का सामना करना पड़ा है क्योंकि मेरी भाषा सिंटैक्स (वर्ग विधियों) के माध्यम से परिभाषित फ़ंक्शन और मानों को सौंपे गए अनाम फ़ंक्शंस के बीच अंतर नहीं करती हैdef ( =>इसका उपयोग करके बनाया गया है ) - यह कार्यान्वयन और व्यवहार दोनों में अंतर को हटा देता है

परिणाम यह है कि निम्नलिखित दो परिभाषाओं का मतलब एक ही है:

def square(x: Int) = x*x

val square = (x: Int) => x*x

बाद के फॉर्म (तत्काल अनाम फ़ंक्शन असाइनमेंट) का किसी भी सामान्य स्थिति में उपयोग करने का कोई कारण नहीं है - फॉर्म के बजाय इसका उपयोग करना संभव है def

नामित कार्यों को परिभाषित करने के लिए इस तरह के डुप्लिकेट सिंटैक्स होने से भाषा या किसी अन्य डिजाइन पहलू की रूढ़िवादिता को चोट पहुंचेगी?

मैं इस समाधान को पसंद करता हूं क्योंकि यह विधियों और नामित कार्यों (के माध्यम से def) की छोटी और सहज परिभाषाओं के लिए अनुमति देता है , और अनाम कार्यों (उपयोग =>) की कम परिभाषाओं के लिए ।

संपादित करें: स्काला दोनों के बीच अंतर करता है - अनाम फ़ंक्शन defस्कैला में परिभाषित तरीकों के समान नहीं हैं । हालांकि मतभेद अपेक्षाकृत सूक्ष्म हैं - मैं पहले से जुड़े पदों को देखता हूं।


However, assigning existing functionsवाक्य का अंत याद आ रहा है
इज़काता

1
क्या आप अपने valअंकन का उपयोग करके पुनरावर्ती कार्यों को परिभाषित कर सकते हैं ?
जियोर्जियो

2
मैंने सत्यापित किया कि स्काला में भी यह संभव है। SML में यह नहीं है और आपको funपुनरावर्ती फ़ंक्शन को परिभाषित करने के लिए उपयोग करना होगा।
जियोर्जियो

3
दूसरा रूप वास्तव में एक विशेष वाक्य रचना नहीं है, तरीका defहै। यह इस तथ्य का सिर्फ एक पक्ष प्रभाव है कि एक अनाम कार्य, कहना (x : Int) => x + 1एक वस्तु है, और वस्तुओं को मूल्यों के साथ सौंपा जा सकता है val f = ...। भाषा डिजाइनरों को सिंटैक्स को हटाने के लिए अपने रास्ते से बाहर जाना पड़ा होगा । यह दो अलग-अलग वाक्यविन्यासों का समर्थन करने के प्रयास में स्पष्ट रूप से समान नहीं है जो एक ही चीज़ करते हैं (लगभग)।
KChaloux 19

3
किसी भाषा में एक से अधिक तरीके से कुछ करने का प्रमुख लाभ यह है कि यह अनुत्पादक धार्मिक बहस शुरू करने का एक शानदार तरीका है, जो वास्तविक समस्याओं से विचलित होता है (विचार C ++ यहाँ) .......
मैट्नज़

जवाबों:


3

मुझे लगता है कि दो निर्माण होने का मतलब एक ही चीज़ है लेकिन अलग दिखना एक भाषा में बिल्कुल न्यूनतम रखा जाना चाहिए। कोई भी दोहराव बढ़ता है कि आपकी भाषा को पढ़ना (और इस प्रकार कोड लिखना / संशोधित करना) कितना मुश्किल है। सभी दोहराव को खत्म करना एक ऐसी भाषा में अपरिहार्य है जो मनमाने ढंग से निर्माण कर सकता है (उदाहरण के लिए, पुनरावृत्ति बनाम पुनरावृत्ति की समानता)।

इसलिए इस मामले में, मुझे लगता है कि इसे यहां बेहतर तरीके से डिजाइन किया जा सकता है। कार्यों को परिभाषित करने का एक एकल तरीका मेरे लिए सबसे अधिक समझ में आता है। इस मामले में, यह दो स्कैला बयानों की तरह लगता है जो आपके वास्तव में थोड़े अलग निहितार्थ हैं, जो फिर से अच्छा डिज़ाइन नहीं है (शायद सबसे अच्छा कुछ स्पष्ट करना है जो बताता है कि क्या अंतर है, एक कीवर्ड की तरह)।

वास्तव में, आप इस सिद्धांत को न केवल नामित कार्यों के लिए, बल्कि किसी भी फ़ंक्शन पर भी लागू कर सकते हैं । नामित कार्यों और अनाम कार्यों को परिभाषित करने में कोई अंतर क्यों है? में लीमा , कार्य हमेशा इस तरह परिभाषित कर रहे हैं: fn[<arguments>: <statements>]। यदि आप चाहते हैं कि इसे "नाम" दिया जाए var x = fn[<arguments: <statements>], तो आप इसे एक चर में असाइन कर सकते हैं: और यदि आप इसे किसी अन्य फ़ंक्शन में अनामित करना चाहते हैं function[fn[<arguments: <statements>]]:। यदि आप चाहते हैं कि इसे फहराया जाए, तो इसे स्थिर बनाएं const var x = fn[<arguments: <statements>]। एकल रूप यह स्पष्ट करता है कि उनका मतलब एक ही चीज से है।


यह काफी दिलचस्प है जो constफहराने का कारण बनता है, लेकिन यह सही समझ में आता है। जेएस में function myFuncउत्थापन का कारण बनता है, लेकिन var myFunc =ऐसा नहीं है, जो शायद थोड़ा कम सहज है, क्योंकि वे अन्यथा बहुत अधिक व्यवहार करते हैं।
एमपीएन

1
@mpen हाँ, वास्तव में जावास्क्रिप्ट अनिवार्य रूप से एक ही काम करता है। function fnName()...प्रपत्र वास्तव में एक निरंतर है, जो है क्या इसके साथ करने के लिए एक वैध बात उत्थापन बनाता पैदा नहीं करता है। जब आप फ़ॉर्म का उपयोग करते हैं, तो जावास्क्रिप्ट बहुत अच्छी तरह से भ्रमित करता है var fn = function anotherFnName()...क्योंकि इससे नाम anotherFnName नहीं फहराता है, यहां तक ​​कि इसके स्पष्ट रूप से स्थिर होने पर भी।
बीटी

2

आपने जो पोस्ट किया है वह वैध स्कैला है और ठीक काम करता है।

यह देखते हुए कि दोहरीकरण से स्कैला (मेरी जानकारी में) समस्या नहीं हुई है, मैं यह कहने जा रहा हूं कि यह आपकी भाषा के लिए भी समस्या नहीं होगी।


1
यह स्काला में मान्य है, यह ज्यादातर एक ही काम करता है, लेकिन इसका मतलब एक ही बात नहीं है - और यदि आप अधिक जटिल उदाहरण बनाते हैं (प्रकार बहुरूपता अनाम कार्यों के लिए उपलब्ध नहीं है जैसे) - अंतर अधिक स्पष्ट हो जाएगा।
जकोरा

2

मुझे defस्काला में लैम्ब्डा और विधियों के बीच एक बुनियादी अंतर मिला है - कि मुझे अभी भी यकीन नहीं है कि मैं लागू करना चाहता हूं। मुझे इस पर और शोध करना है और फिर मैं अपने निर्णय पर वापस रिपोर्ट करूँगा।

अनिवार्य रूप से, केवल विधियाँ ही कर सकती हैं return- और जब कीवर्ड का उपयोग लंबोदा से किया जाता है, तो यह वास्तव में शामिल विधि से लौटता है।

जैसा कि मैंने कहा है, मुझे यकीन नहीं है कि मुझे यह चाहिए। लेकिन यह इस वाक्यविन्यास के लिए पर्याप्त औचित्य हो सकता है। या शायद बहुत खतरनाक है क्योंकि सूक्ष्म अंतर अप्रत्याशित रूप से नुकसान पहुंचा सकता है।

विवरण

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.