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

Cit*_*ane 8 c#

介绍

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

我已经读到这个线程,这等一个可能的解决方案,并只是想知道往哪个方向最好了多少努力,可能只占到解决以下三个问题语法*.

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

1.多个输出参数

我想写:

 [double x, int i] = foo(z);
Run Code Online (Sandbox Code Playgroud)

代替:

 double x;
 int i;
 foo(out x, out i, z);
Run Code Online (Sandbox Code Playgroud)

注意: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;
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

代替:

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

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)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

会成为:

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)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

*编译器可能只是生成一个警告,表明它解决了歧义,因为implicit已经定义了解决方案.

注意:3)足以满足解决2).

Mat*_*ias 7

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

您的第一个场景包含元组; 你可以编写一个函数let f a b = (a+b, a-b),它可以直接返回2个值的元组,你可以相当容易地重载运算符或添加你自己的函数,而模块可以帮你解决第3个问题.而且F#与C#相当平滑地互操作,所以你甚至可以选择F#来实现它的部分,并将其余的代码保存在C#中.还有其他细节可以用于科学代码(例如测量单位)......


Ani*_*Ani 3

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

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

  • 哦,内姆雷莱!它遇到了我在评论中概述的所有相同问题。C# 并不是一种糟糕的语言,它需要一个与 Coffeescript 相当的语言。 (2认同)