सही रेंज शाब्दिक डिजाइनिंग


10

मैं सोच रहा था कि मैं "सही" रेंज शाब्दिक डिजाइनिंग के बारे में कैसे जाऊंगा अगर मैं एक भाषा डिजाइन करने के लिए था। आपके लिए जो विवरण में श्रेणी शाब्दिक नहीं जानता है, वह 1-4 जैसे मानों की श्रेणी का प्रतिनिधित्व करता है। वे सबसे अधिक / foreach छोरों के लिए उपयोग किया जाता है

कुछ मुद्दों पर ध्यान देना चाहिए

  • समावेशी और अनन्य श्रेणियों के लिए समर्थन, +1 या -1 से समापन बिंदुओं तक से निपटने के लिए थोड़ा सा और त्रुटिपूर्ण लगता है।

  • कदम रखने के लिए समर्थन, इसलिए आप उदाहरण के लिए सम या विषम संख्या की सीमा बना सकते हैं

  • पठनीयता, यह स्पष्ट रूप से स्पष्ट होना चाहिए कि सीमा शाब्दिक क्या बताती है

  • लापरवाही, यह पूरी तरह से अस्पष्ट होना चाहिए कि सीमा शाब्दिक क्या बताती है

  • डिफ़ॉल्ट संभवत: समावेशी से अनन्य होना चाहिए क्योंकि ज्यादातर मामलों में इसका उपयोग सरणियों पर लूपिंग आदि के लिए किया जाता है।

वैसे भी, मैंने देखा है कि रेंज शाब्दिक का एक उदाहरण रूबी है जो एक विशेष (अंत पर) रेंज के लिए 1..3 और समावेशी (अंत पर) के लिए 1 ... 3 के रूप में है। आप 1..10.step (5) भी कर सकते हैं। सावधान विचार के बाद मुझे कुछ चीजें मिलीं जो मुझे उस दृष्टिकोण के बारे में पसंद नहीं थीं (माणिक के अपने सीमित ज्ञान से)

  1. आप केवल अंत के लिए समावेशी और अनन्य का वर्णन कर सकते हैं। अधिकांश परिदृश्यों का वर्णन करते समय यह थोड़ा असंगत लगता है।

  2. केवल एक अतिरिक्त द्वारा भिन्नता। यह देखने के लिए एक नुस्खा की तरह लगता है कि यह मुश्किल है कि कोई रेंज समावेशी है या अनन्य है। मैं तुम्हारे बारे में नहीं जानता, लेकिन कलंक के कुछ बनने की प्रवृत्ति है :)

  3. श्रेणियों के लिए संकेतन की तरह विधि जोड़ना एक वर्ग के साथ शाब्दिक की धारणा को मिलाता है जो थोड़ा असंगत लगता है (भले ही श्रेणी एक वर्ग के लिए संकलित हो)

वैसे भी, अलग-अलग विकल्पों पर विचार करने के बाद। मैं यह लेकर आया था

  • [५.१] ५,४,३,२,१
  • [१.५.५ [ १,२,३,४]
  • ] 1..5] 2,3,4,5
  • [ 0..5..20] 0,5,10,15,20

इत्यादि। मुझे यह पसंद है क्योंकि [आम तौर पर एक सेट को दर्शाता है और यह थोड़े में फिट बैठता है, भले ही एक सेट के विपरीत यह आदेश दिया जाएगा।

एक बात मैं थोड़ा सा फटा हुआ हूं, हालांकि यह अनन्य / समावेशी संकेतकों को अनिवार्य बना रहा है या नहीं, यदि आप सिर्फ 1..5 लिखते हैं तो डिफ़ॉल्ट 1,2,3,4 होगा क्योंकि यह सरणियों आदि के साथ सबसे आम मामला है। यह आसान और अधिक पठनीय है, लेकिन कम विशिष्ट है और अगर आपको लिखना पड़ा [१.५.५] आप जल्दी सीखते हैं कि वे कैसे काम करते हैं।

तो आपको क्या लगता है, क्या मैंने ज्यादातर आधारों को कवर किया, कुछ को अनदेखा किया? क्या आप [] को अनिवार्य करेंगे? क्या आप अपनी प्रोग्रामिंग लैंग्वेज में रेंज लिटरल्स को अलग तरह से डिजाइन करेंगे?

उम्मीदवार

  • ब्रैकेट शैली: [0..10] , कदम के साथ: [0..5..20]
  • अंतराल संकेतन: [0..10) कदम के साथ: [0..5..20)
  • विशेष के लिए विस्मयादिबोधक। 0 ..! 10, कदम के साथ: 0..5 ..! 20
    • अलग कदम के साथ। ० ..! २०, ५
    • हालाँकि, यह डिफ़ॉल्ट * 0..10 को समावेशी-समावेशी बना देगा
  • वर्डी: [० से २० तक ५]

मुझे कहना होगा कि मेरा अब तक का पसंदीदा सौंदर्य 0 है! ..! 10 और 0..5 ..! 20 , मैं सिर्फ डिफ़ॉल्ट रूप से इच्छा रखता हूं। 0..10 समावेशी-अनन्य के लिए अधिक तार्किक होगा


2
1,5,10,15,20गैप 4, 5, 5, 5 ?!
पीटर टेलर

उफ़ :) सही किया
होमड

जवाबों:


14

गणित में पहले से मौजूद क्यों का आविष्कार करें?

मध्यवर्ती टिप्पणी

यह आपके 'अस्पष्टता' बिंदु को कवर करना चाहिए क्योंकि यह पहले से मौजूद है।

आपका एकमात्र मुद्दा कदम को परिभाषित करना होगा। हो सकता है कि गणित में कुछ और मदद कर सकता है?


3
नमस्ते, मैं वास्तव में अंतराल संकेतन के बारे में हूँ। हालाँकि जो चीज मुझे इस्तेमाल नहीं करनी थी, वह यह थी कि यह दोनों [और) के साथ सममित नहीं थी और पैरेन्थेसिस के साथ-साथ स्टेप्स भी नहीं थे (जैसा कि आप उल्लेख करते हैं)। पैरेन्थेसिस का उपयोग करने से ब्रेस मिलान को भ्रमित करने की क्षमता होती है और मैं उन्हें भावों में सहेजता हूं। का उपयोग करना] और [एक आईएसओ मानक है और कदम को एकीकृत करने के साथ बेहतर जाना प्रतीत होता है, लेकिन यह सिर्फ मेरी राय है।
होमडे

7
@MKO: बेजोड़ कोष्ठक (जैसे [1..5[) का उपयोग करने का आपका विचार संपादकों को कम से कम उतना ही भ्रमित करेगा जितना कि मानक अंतराल संकेतन।
डेविड थॉर्नले

2
हम्म, एक और विचार, उपयोग करने के बारे में क्या! के लिए, अर्थात्: 1 ..! 5 या 0..5 ..! 20 (कदम के साथ)
होमडे

1
@MKO: !पहले या अंतिम तत्व को बाहर करने का उपयोग करना अच्छा हो सकता है।
FrustratedWithFormsDesigner

8

क्या आपने हास्केल पर्वतमाला देखी है? चरणों के लिए उनका विचार आपके (बीच में) के समान है, लेकिन एक वाक्यात्मक अंतर के साथ संकेत दिया गया है ( @ लूकी के उत्तर से ):

[1,2..10] = [1,2,3,4,5,6,7,8,9,10]
[1,3..10] = [1,3,5,7,9]
[4,3..0]  = [4,3,2,1,0]
[0,5..]   = [0,5,10,15,20,25,30,35...  -- infinite
[1,1..]   = [1,1,1,1,1,1,1,1,1,1,1...  -- infinite

मुझे यह नोटेशन बहुत सहज लगता है: आप एनुमरेट करना शुरू कर देते हैं और शरीर पर छोड़ते हैं और यह चिन्हित करते हैं कि इसे कहाँ समाप्त होना चाहिए।

यह "अनन्य" के लिए मामले को कवर नहीं करता है, लेकिन स्पष्ट रूप से, मैं एक बार व्यवहार के बारे में स्पष्ट होना चाहूंगा (निर्दिष्ट करें कि कौन सी सीमा समावेशी है और कौन सी अनन्य है), और उपयोगकर्ता से समायोजन करने की उम्मीद करता है जब तक कि वाक्यविन्यास बहुत स्पष्ट न हो (और भाषा अज्ञेय संपादकों को भ्रमित नहीं करता है)।


5

आपको उन भाषाओं की सूची समझ के बारे में पढ़ना चाहिए जो उन्हें पेश करती हैं।

उदाहरण के लिए, पायथन range()समारोह के साथ आपके मामलों को बहुत अच्छी तरह से कवर करता है और मामलों के लिए सूची की समझ भी बहुत जटिल है range()


2

मेरा मानना ​​है कि आपका अंकन असंदिग्ध होने से बहुत दूर है। सहज रूप से, [0..5..20]मुझे कदम चौड़ाई के साथ एक सीमा की तरह नहीं दिखता है = 5. यह कुछ कोने के मामलों में भी विफल रहता है: सेट को व्यक्त करने के बारे में क्या है (0,2) - [0..2..2]या मुझे बीच में क्या डालना चाहिए?

मुझे लगता है कि पायथन का स्लाइस अंकन एक ठोस दृष्टिकोण है: [start:end:step](वैकल्पिक होने के नाते)।

यदि आपको वास्तव में अनन्य और समावेशी श्रेणियों के लिए समर्थन की आवश्यकता है, तो मैं मानक श्रेणी नोटेशन (अर्थात उपयोग (और [) का उपयोग करूंगा जब तक कि यह आपकी भाषा में वाक्यात्मक अस्पष्टता का परिचय न दे।


1
"मानक" अंकन के बारे में, यूरोपीय स्कूलों को पढ़ाने [], [[, ]]और ][, कोई कोष्ठक ... और हमारे मानक ज़ाहिर है, बेहतर है;)
माथीउ एम

@Matthieu: असल में, नीदरलैंड (जिसमें यहां है यूरोप में), हम भी है कि मानक संकेत सिखाया जाता था।
फ्रिट्स

1

मुझे लगता है कि जब आप तीसरी वृद्धि मूल्य निर्धारित कर रहे हैं, तो आप इसे अंत में जोड़ना बेहतर होगा, बजाय मध्य के, क्योंकि यह एक वैकल्पिक मूल्य है, और अनुभवी प्रोग्रामर को बीच में एक वैकल्पिक 3 तर्क जोड़ने की तुलना में अधिक सहज लगता है। ।

इसलिए [1..5..20] के बजाय आप कुछ ऐसा कर सकते थे जैसे [1..20] [5] या [1..20,5]


यह एक वैध बिंदु है और शायद स्वाद का मामला है, यह सिर्फ मुझे लग रहा था कि यह "1 चरण 5 से 20" के बजाय "1 से 2, चरण 5 के साथ" [1..20] का उपयोग करना आसान होगा। [५] थोड़ा अव्यवस्थित लगता है लेकिन शायद अल्पविराम दृष्टिकोण व्यवहार्य होगा। मैं उस पर अधिक प्रतिक्रिया की सराहना करता हूं
होमडे

1
  • [१.५.५ [१,२,३,४]
  • ] 1..5] 2,3,4,5
  • ] 1..5 [2,3,4

सिर्फ [१.४], [२.५], [२.४] का उपयोग क्यों नहीं करते? रेंजिंग को छोड़कर अधिक लाभ नहीं मिलता है। आपको MIN + 1 या MAX-1 लिखने की आवश्यकता नहीं है, हाँ, लेकिन वे इसे वैसे भी प्रतिबंधित नहीं करते हैं। बहुत अधिक भिन्नता, इमो। मेरी पसंद की भाषा, स्कैला, में (1 से 3) और (1 तक 3) [= (1 से 2)] है, लेकिन इसने मुझे शुरुआत में भ्रमित किया। अब मैं हमेशा 'x to y' का उपयोग करता हूं और इसलिए जानता हूं, कि जो विकल्प मैं उपयोग नहीं करता हूं वह एक को छोड़कर है, लेकिन निश्चित रूप से मैं एक विकल्प से लाभ नहीं उठाता हूं जिसका मैं उपयोग नहीं करता हूं।

  • [५.१] ५,४,३,२,१

बेशक (1 से अधिकतम) (x => y = (MAX + 1) - x) है, लेकिन यह बहुत बॉयलरप्लेट है और उपयोगकर्ता के अनुकूल नहीं है।

  • [0..5..20] 0,5,10,15,20

बेशक (0 से 4) (x => y = x * 5) इतना बॉयलरप्लेट नहीं है। विवादास्पद।


पर्वतमाला, afaik को बाहर करने का मुख्य लाभ यह है कि तत्वों की संख्या समापन बिंदुओं का अंतर है।
जस्टिन एल।

@JustinL .: 5-1 मेरे बीजगणित में 4 है, लेकिन इसमें 3 तत्व शामिल हैं, सीमाओं को छोड़कर: 2, 3, 4.
उपयोगकर्ता अज्ञात

1

इस तरह के किसी चीज़ के बारे में क्या:

  • [५.१] ५,४,३,२,१
  • [१.५.५] [i, e] १,२,३,४
  • [५.१.१] [i, e] ५,४,३,२
  • [१.५.५] [ई, i] २,३,४,५
  • [1..5] [ई, ई] 2,3,4
  • [0..20] 5 0,5,10,15,20 से

iऔर eवर्ग कोष्ठक की दूसरी जोड़ी में इंगित करता है शुरुआत या सीमा के समाप्त होने के समावेशी या अनन्य है (या आप इस्तेमाल कर सकते हैं incl, और exclयदि आप और अधिक स्पष्ट होना चाहते हैं)। by 5कदम अंतराल को इंगित करता है। पहला और अंतिम उदाहरण पहले और अंतिम मूल्य को सम्मिलित करता है, इसलिए मैंने छोड़ दिया [i,i], जो मुझे लगता है कि एक ठीक माना गया डिफ़ॉल्ट व्यवहार होगा।

डिफ़ॉल्ट मान [i,i]समावेशी / अनन्य विनिर्देशक और by 1चरण विनिर्देशक के लिए हो सकते हैं।

आम तौर पर मैं मानक को शामिल अंकन सुझाव दिया था है (और [के रूप में @Dan मैक्ग्रा ने उल्लेख किया है, लेकिन मैं इस बात से सहमत कोड में यह भ्रामक लग सकता है।


क्या कोई नीच को समझा सकता है?
FrustratedWithFormsDesigner 14

मैंने कुछ भी गलत तरीके से नहीं देखा । मैं downvote का प्रतिकार करने के लिए बढ़ा।
बेरिन लोरिट्सच

1

और विजेता है

अपने स्वयं के समाधान को क्षमा करने के लिए क्षमा करें, मैं वास्तव में सभी टिप्पणियों और प्रतिक्रिया की सराहना करता हूं और यदि आप इसके साथ कुछ भी गलत पाते हैं तो कृपया इस समाधान की आलोचना करें।

इसलिए मैंने साथ जाने का फैसला किया:

0..5           = 0,1,2,3,5
0..5..10       = 0,5,10
..3            = 0,1,3
!0..!5         = 1,2,3,4
3..            = 3 to infinity

segmented ranges
-
0..5,..5..20   = 0,1,2,3,4,5,10,15,20
0..3,10..5..20 = 0,1,2,3,10,15,20

जैसा कि आप देख सकते हैं समावेशी दोनों इंद्रियों पर डिफ़ॉल्ट है, यह विशेष रूप से कदम का उपयोग करते समय सहज ज्ञान युक्त सबसे अधिक समझ में आता है। आप उपयोग कर सकते हैं ! एक विशेष बनाने के लिए।

नकारात्मक पक्ष यह है कि आम तौर पर आप किसी ऐरे के खिलाफ काम करते समय अनन्य का उपयोग करना चाहते हैं, लेकिन फिर, ज्यादातर बार आपको संभवतः उन मामलों में प्रत्येक के लिए कुछ का उपयोग करना चाहिए। यदि आपको वास्तव में सूचकांक के खिलाफ काम करने की आवश्यकता है तो पार्सर पहचान सकता है जब आप संभवतः अंत पर बहिष्करण मार्कर को भूल गए और चेतावनी जारी करें

मैं कॉमा या कुछ और का उपयोग करने के बजाय चरण चर के दोनों ओर का उपयोग करके चला गया .. क्योंकि यह सबसे साफ दिखता है और मुझे उम्मीद है कि यह सबसे अधिक पठनीय होगा।

मैं भी कुछ सिंटैक्स में कॉमा के साथ फेंक देता हूं जो कि उन हिस्सों को बनाने में सक्षम होता है जहां विभिन्न भागों में अलग-अलग चरण होते हैं


कदम को निर्दिष्ट करते समय यह ठीक लगता है। मुझे लगता है कि [०.१०] ५ के रूप में क्लीनर होगा। खंडित सीमा [०.५.५, ५.२० गुणा ५] हो सकती है, इत्यादि। [यह भी निर्दिष्ट कर सकता है कि पहले चरण से संख्याएँ], जो (अन्य रूपों के विपरीत) शून्य के चरण आकार की अनुमति दे सकती हैं।
सुपरकैट

0

मैं उन कारणों में से एक के लिए '[1..5 [' 'फॉर्म का उपयोग नहीं करूंगा जिनमें आप परेंस और ब्रेसेस को मिलाने से बचेंगे - यह अधिकांश मौजूदा संपादकों के ब्रेस मैच को भ्रमित करेगा। शायद ब्रेसिज़ के अंदर एक मार्कर का उपयोग करें, जैसे '[1 .. | 5]'।

विचार करने के लिए दूसरी चीज सीमाएं प्राप्त करने के तरीकों का व्यवहार है। उदाहरण के लिए, 'शुरू' / 'अंत' बनाम 'पहला' / 'अंतिम' बनाम 'मिनट' / 'अधिकतम'। उन्हें समावेशी और अनन्य दोनों सीमाओं के लिए समझदार होने की आवश्यकता है, साथ ही साथ एक कदम आकार वाले भी।


0

रूबी के पास संकेतन और एक रेंज ऑब्जेक्ट है जो काम करता है। अनिवार्य रूप से यह इस तरह दिखता है:

1..5  # range 1,2,3,4,5

रूबी के साथ, चरण आकार सीमा का कार्य नहीं है, बल्कि सीमा के माध्यम से पुनरावृत्ति का कार्य है। यदि हम चाहते थे कि हम इसके ऊपर समान श्रेणी का उपयोग कर सकें और इसके माध्यम से पुनरावृति कर सकें:

(1..5).step(3) { |x| puts x }
(1..5).step(2) { |x| puts x }

तो यहां ऐसी चीजें हैं जिन पर आप विचार करना चाहते हैं:

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

यदि आप उन्हें रूबी की तरह स्विच स्टेटमेंट में शामिल करने की अनुमति देते हैं, तो BTW, पर्वतमाला बहुत अच्छी हैं:

switch(myval)
    when 0..33 then puts "Low"
    when 34..66 then puts "Medium"
    when 67..100 then puts "High"
end

मैं यह नहीं कह रहा हूं कि रूबी की रेंज ऑब्जेक्ट सभी का अंत है और सभी हो सकता है, लेकिन यह उस अवधारणा का एक कार्यशील कार्यान्वयन है जिसके बारे में आप बात कर रहे हैं। यह देखने के लिए कि आपको क्या पसंद है, नापसंद है, और अलग तरह से करेंगे।


प्रश्न को ध्यान से पढ़ें, ओपी को पहले से ही रूबी पर्वतमाला के बारे में पता है:Anyways, one example of range literal I've seen is Ruby which is in the form of 1..3 for an exclusive (on the end) range and 1...3 for inclusive (on the end). You can also do 1..10.step(5).
FrustratedWithFormsDesigner

0

एक समाधान जिसका मैं निश्चित रूप से विचार करूंगा, जैसे कि अनुमति देने के लिए ऑपरेटर ओवरलोडिंग का उपयोग कर रहा है

1+[0..3]*5

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

स्पष्ट करने के लिए, परिणाम होगा [1, 6, 11, 16], गुणा को उठाना और फिर सीमा के अतिरिक्त जोड़ना। मुझे एहसास नहीं था कि यह पायथन उपयोगकर्ताओं के लिए अस्पष्ट हो सकता है; मुझे लगता है कि सूची के बजाय कुल आदेशों के सबसेट के रूप में पर्वतमाला। और एक सेट को दोहराने से कोई मतलब नहीं है।


2
बहुत अस्पष्ट। list expression * 5इसका अर्थ " list expression5 गुना मान" को दोहरा सकता है , जैसा कि पाइथन में है।
निक्की

यह बहुत अजीब लग रहा है और मुझे यकीन नहीं है कि यह क्या होगा ... 1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3? 1,3,6,9,12? 5,10,15? कुछ और, शायद? किसी भी तरह से, मैं इस संकेतन को पूरी तरह से प्रतिसंतुलित पाता हूं। ऐसा लगता है कि यह शायद अजीब सी पॉइंटर ऑपरेशन के कुछ प्रकार है ...
FrustratedWithFormsDesigner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.