8

介绍

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

我已经阅读了这个线程和另一个线程以获取可能的解决方案,并且只想知道最好的方向以及仅解决以下三个语法问题可能需要付出多少努力*。

*:我可以在没有描述的语法糖的情况下生存,但如果不是太多的工作和简单的编译过程的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. 静态类的自动名称插入

在计算代码中无休止地重复Math .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) 的问题。

4

2 回答 2

7

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

Your first scenario is covered with tuples; you can write a function like let f a b = (a+b, a-b), which returns a tuple of 2 values directly, you can fairly easily overload operators or add your own, and modules may help you with the 3rd. And F# interoperates fairly smoothly with C#, so you can even pick F# for the parts where it's practical, and keep the rest of your code in C#. There are other niceties which work great for scientific code (units of measure for instance) as well...

于 2012-05-27T05:10:40.437 回答
3

我将成为第一批支持可由用户扩展的主流 C# 的人之一。但是 - 由于几个原因(设计、时间或成本效益),我看不到 C# 可以像您(或我)想要的那样可扩展。我发现 AC# 派生语言非常适合元编程和扩展功能/语法是Nemerle

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

于 2012-05-27T01:43:37.993 回答