介绍
作为一名开发人员,我每天都参与编写大量数学代码,我想在 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) 的问题。