作为一名开发人员,我每天都参与编写大量的数学代码,并且我想在C#语言中添加很少的语法糖来简化代码编写和审阅。
我已经阅读了这个thread以及其他one的可能解决方案,并且只想知道哪个方向最好以及它可以代表多少努力才能解决这三个问题。遵循句法问题*。
*:我可以在没有描述语法糖的情况下生存,但如果没有太多的工作和 Rube-Goldberg 设计用于简单的编译过程,那么进一步调查可能会很有趣。
我想写:
[double x, int i] = foo(z);
而不是:
double x;
int i;
foo(out x, out i, z);
注意:首先放置out
个参数,并像往常一样声明foo
(或使用相同的语法)。
我想要一些新的一元/二元运算符。不知道如何定义这些(并且在解析源时不会引入歧义似乎相当复杂),无论如何都希望有类似的东西:
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()而不是直接写 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)。
答案 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)