扩展C#语言,多少努力/收益?

时间:2012-05-27 01:36:58

标签: c#

简介

作为一名开发人员,我每天都参与编写大量的数学代码,并且我想在C#语言中添加很少的语法糖来简化代码编写和审阅。

我已经阅读了这个thread以及其他one的可能解决方案,并且只想知道哪个方向最好以及它可以代表多少努力才能解决这三个问题。遵循句法问题*。

*:我可以在没有描述语法糖的情况下生存,但如果没有太多的工作和 Rube-Goldberg 设计用于简单的编译过程,那么进一步调查可能会很有趣。

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);
         }
    }
}

3。静态类的自动名称插入

在计算代码中无处不在地重复数学 .BlaBlaBla()而不是直接写 BlaBlaBla 是极其没有吸引力的。

可以肯定这可以通过添加本地方法来解决,在计算类中包装 Math .BlaBlaBla。无论如何,当没有歧义时,或者使用某种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)。

2 个答案:

答案 0 :(得分:7)

您是否考虑过使用F#代替C#?根据我的经验,我发现F#非常适合科学/数学导向的代码,而不是C#。

您的第一个场景包含元组;你可以写一个像let f a b = (a+b, a-b)这样的函数,它可以直接返回2个值的元组,你可以很容易overload operators或者添加你自己的函数,模块可以帮助你获得第3个。而且F#与C#相当平滑地互操作,所以你甚至可以选择F#来实现它的部分,并将其余的代码保存在C#中。还有其他细节对于科学代码(例如units of measure)也很有用......

答案 1 :(得分:3)

我是第一批支持可由用户扩展的主流C#的人之一。但是 - 由于多种原因(设计,时间或成本效益),我无法看到C#像您(or I)想要的那样具有可扩展性。我发现一种C#派生的语言非常适合元编程,扩展功能/语法是Nemerle

Boo是另一种具有良好元编程功能的.NET语言。但是,它远离C#,我不认为它是这个问题的合适答案(但是为了完整性而添加它,无论如何)。