作为一名开发人员,我每天都参与编写大量的数学代码,并且我想在C#语言中添加很少的语法糖来简化代码编写和审阅.
我已经读到这个线程,这等一个可能的解决方案,并只是想知道往哪个方向最好了多少努力,可能只占到解决以下三个问题语法*.
*:我可以在没有描述语法糖的情况下生存,但如果没有太多的工作和Rube-Goldberg为简单的编译过程设计,那么进一步调查可能会很有趣.
我想写:
[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像往常一样声明(或使用相同类型的语法).
我想要一些新的一元/二元运算符.不知道如何为这些定义(并且在解析源时不引入歧义似乎相当复杂),无论如何想要有类似的东西:
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)
这是非常吸引人无休止地重复数学的计算代码.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).
我是第一批支持可由用户扩展的主流 C# 的人之一。然而,由于多种原因(设计、时间或成本效益),我看不到 C# 具有您(或我)想要的可扩展性。我发现Nemerle是 C# 派生语言,非常适合元编程和扩展功能/语法。
Boo是另一种具有良好元编程功能的 .NET 语言。然而,它与 C# 相去甚远,以至于我认为它不是这个问题的合适答案(但无论如何还是为了完整性而添加了它)。
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |