2012-05-27 12 views
8

परिचय

एक डेवलपर के रूप में, मैं प्रतिदिन बहुत सारे गणितीय कोड लिखने में शामिल हूं और मैं कोड लेखन और समीक्षा को कम करने के लिए सी # भाषा में बहुत कम वाक्य रचनात्मक चीनी जोड़ना चाहता हूं।विस्तार सी # भाषा, कितना प्रयास/लाभ?

मैं पहले से ही thread और इस अन्य one के बारे में संभावित समाधानों के लिए पढ़ चुका हूं और यह जानना चाहूंगा कि कौन सी सबसे अच्छी दिशा है और यह केवल निम्नलिखित तीन सिंटैक्टिकल मुद्दों * के लिए हल करने के लिए कितना प्रयास कर सकता है।

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

1. एकाधिक उत्पादन तर्क

मैं चाहता लिखने के लिए:

[double x, int i] = foo(z); 

बजाय:

double x; 
int i; 
foo(out x, out i, z); 

एनबी: out मापदंडों पहले रखा जा रहा है और हमेशा की तरह foo घोषित किया गया (या उसी तरह के वाक्यविन्यास का उपयोग कर)।

2. अतिरिक्त ऑपरेटर

मैं चाहूँगा कुछ नए एकल/बाइनरी ऑपरेटरों के लिए। ज्यादा पता नहीं है इन के लिए परिभाषित करने के लिए कैसे (और यह जब स्रोतों को पार्स अस्पष्टता को शुरू नहीं करने के लिए काफी जटिल लगता है), वैसे भी करना चाहते हैं कुछ की तरह:

namespace Foo 
{ 
    using binary operator "\" as "MyMath.LeftDivide"; 
    using unary operator "'" as "MyMath.ConjugateTranspose"; 

    public class Test 
    { 
     public void Example() 
     { 
      var y = x'; 
      var z = x \ y; 
     } 
    } 
} 
के बजाय

:

namespace Foo 
{ 
    public class Test 
    { 
     public void Example() 
     { 
      var y = MyMath.ConjugateTranspose(x); 
      var z = MyMath.LeftDivide(x, y); 
     } 
    } 
} 

स्थिर कक्षाओं

यह अत्यंत अंतहीन) एक गणना कोड में बजाय सीधे लिखने की मठ .BlaBlaBla (दोहरा करने के लिए हर जगह अनाकर्षक है के लिए 3. स्वचालित नाम प्रविष्टि और बस नीला एब्लला

निश्चित रूप से मैथ रैप करने के लिए स्थानीय विधियों को जोड़कर हल किया जा सकता है। बलाबालाबाला गणना कक्षा के अंदर। वैसे भी बेहतर होगा जब कोई अस्पष्टता नहीं है, या जब आवश्यक हो तो कक्षा नामों को स्वचालित रूप से सम्मिलित करने के लिए implicit कीवर्ड के साथ अस्पष्टता हल की जाएगी।

उदाहरण के लिए:

using System; 
using implicit MySystem; // Definying for 'MyMaths.Math.Bessel' 

public class Example 
{ 
    public Foo() 
    { 
     var y = 3.0 * Cos(12.0); 
     var z = 3.0 * Bessel(42); 
    } 

    // Local definition of 'Bessel' function again 
    public static double Bessel(double x) 
    { 
     ... 
    } 
} 

बन गयी:

using System; 
using MySystem; // Definying for 'Math.Bessel' 

public class Example 
{ 
    public Foo() 
    { 
     var y = 3.0 * System.Math.Cos(12.0); // No ambiguity at all 
     var z = 3.0 * MySystem.Math.Bessel(42); // Solved from `implicit` keyword 
    } 

    // Local definition of 'Bessel' function again 
    public static double Bessel(double x) 
    { 
     ... 
    } 
} 

* संकलक बस एक चेतावनी संकेत मिलता है कि यह अस्पष्टता हल क्योंकि एक implicit समाधान परिभाषित किया गया है उत्पन्न हो सकता है।

एनबी: 3) 2 को हल करने के लिए पर्याप्त संतुष्ट है)।

+0

मिगुएल डी इकाज़ा सी # में भी tuple चाहता था http://tirania.org/blog/archive/2009/Dec-23.html –

+7

Effot == बहुत और बहुत कुछ। लाभ == लगभग शून्य। जब तक आप जो भी प्रोग्रामिंग प्रोजेक्ट नहीं करते हैं, उसमें आप एकमात्र प्रोग्रामर बनना नहीं चाहते हैं, यह एक भयानक विचार है। (आप टूलींग सपोर्ट (यानी रिशेर्पर) को खत्म कर देंगे, आप किसी भी योग्य सी # प्रोग्रामर को अचानक अपनी पसंदीदा भाषा का उपयोग करने के लिए अयोग्य घोषित कर देंगे, कोई भी अंदर आने और आपके कोड को पढ़ने में सक्षम नहीं होगा, कोई रिफैक्टरिंग नहीं है, सूची अंतहीन है।) –

+0

"स्थैतिक वर्गों के लिए स्वचालित नाम सम्मिलन" - क्लास क्वालीफायर के बिना स्थिर फ़ंक्शन का उपयोग करके, जावा में समर्थित; मैं यह नहीं कह रहा हूं कि यह वास्तव में एक अच्छी/बुरी बात है हालांकि: http://www.deitel.com/articles/java_tutorials/20060211/index.html –

उत्तर

3

मैं मुख्यधारा सी # का समर्थन करने वाले पहले लोगों में से एक हूं जिसे उपयोगकर्ताओं द्वारा बढ़ाया जा सकता है। हालांकि - कई कारणों से (डिज़ाइन, समय या लागत-लाभ) मैं सी # को एक्स्टेंसिबल के रूप में नहीं देख सकता क्योंकि आप (or I) चाहते हैं। एक सी # - समर्पित भाषा मैंने पाया है कि मेटा प्रोग्रामिंग के लिए बहुत अच्छा है और कार्यक्षमता/वाक्यविन्यास विस्तारित Nemerle है।

Boo अच्छी मेटा-प्रोग्रामिंग सुविधाओं के साथ एक और .NET भाषा है। हालांकि, यह अब तक सी # से हटा दिया गया है कि मैंने इसे इस प्रश्न का उचित उत्तर नहीं माना (लेकिन इसे पूर्णता के लिए जोड़ा गया, वैसे भी)।

+2

ओह नेमेरे! यह मेरी टिप्पणी में उल्लिखित सभी समस्याओं से ग्रस्त है। सी # इतनी भयानक भाषा नहीं है कि इसे कॉफ़ीस्क्रिप्ट समकक्ष की आवश्यकता है। –

+1

मुझे यकीन है कि ओपी क्रिप्टिक सिंटैक्टिक शुगर (मैं निश्चित रूप से नहीं था) के साथ अपने कार्यस्थल पर सभी सी # कोड को बदलने की सोच नहीं रहा था। कभी-कभी समस्याएं या आम-उपयोग परिदृश्य (डीएसएल सोचते हैं) जिन्हें ऐसी विस्तार की आवश्यकता होती है। एक मॉड्यूल इसे उत्कृष्ट उपयोग के लिए लाभ उठा सकता है जबकि बाकी वेनिला सी # में हो सकते हैं। संक्षेप में ऐसे प्रश्नों को खारिज करते हुए राय प्रतिक्रियाओं के साथ मुझे लगता है कि मुझे प्रगति को हतोत्साहित किया जा सकता है। – Ani

+0

आपके उत्तर के लिए धन्यवाद :) – CitizenInsane

7

क्या आपने सी # के बजाय एफ # का उपयोग करने पर विचार किया है? मेरे अनुभव में, मैंने एफ # वैज्ञानिक/गणितीय उन्मुख कोड के लिए एक महान फिट पाया है, सी # से भी ज्यादा।

आपका पहला परिदृश्य tuples से ढका हुआ है; आप let f a b = (a+b, a-b) जैसे फ़ंक्शन को लिख सकते हैं, जो सीधे 2 मानों का एक टुपल देता है, आप काफी आसानी से overload operators कर सकते हैं या अपना स्वयं का जोड़ सकते हैं, और मॉड्यूल तीसरे के साथ आपकी मदद कर सकते हैं। और एफ # सी # के साथ काफी आसानी से इंटरऑपरेट करता है, इसलिए आप उन हिस्सों के लिए एफ # भी चुन सकते हैं जहां यह व्यावहारिक है, और अपना शेष कोड सी # में रखें। अन्य niceties हैं जो वैज्ञानिक कोड (units of measure उदाहरण के लिए) के लिए बहुत अच्छा काम करते हैं ...

+0

एक और .net भाषा होने के साथ, जहां मैं आसानी से गणितीय कोड लिख सकता हूं और सी #, वीबी या जो भी अच्छा दृष्टिकोण है, के बाकी हिस्सों के साथ इसे बांध सकता हूं (यही वह है जो मैं वर्तमान में सी # से मैटलबंटिम को कॉल करके कर रहा हूं, भले ही काफी भारी प्रक्रिया)। मैं एफ # के लिए गहरी नजर रखूंगा, इसलिए देखें कि यह मेरे मुद्दों के साथ कैसे फिट हो सकता है। धन्यवाद :) – CitizenInsane

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