C# 扩展C语言,付出了多少努力/收获了多少? 介绍
作为一名开发人员,我每天都要编写大量数学代码,我想在C语言中添加很少的语法糖分,以简化代码编写和审查 我已经阅读了关于这一点和其他可能的解决方案,只想知道哪一个方向最好,以及只解决以下三个语法问题需要付出多少努力* *:我可以在没有语法糖的情况下生存下来,但如果没有太多的工作和Rube-Goldberg设计的简单编译过程,进一步研究可能会很有趣 1.多个输出参数 我想写:C# 扩展C语言,付出了多少努力/收获了多少? 介绍,c#,C#,作为一名开发人员,我每天都要编写大量数学代码,我想在C语言中添加很少的语法糖分,以简化代码编写和审查 我已经阅读了关于这一点和其他可能的解决方案,只想知道哪一个方向最好,以及只解决以下三个语法问题需要付出多少努力* *:我可以在没有语法糖的情况下生存下来,但如果没有太多的工作和Rube-Goldberg设计的简单编译过程,进一步研究可能会很有趣 1.多个输出参数 我想写: [double x, int i] = foo(z); 而不是: double x; int i; foo(out
[double x, int i] = foo(z);
而不是:
double x;
int i;
foo(out x, out i, z);
namespace Foo
{
public class Test
{
public void Example()
{
var y = MyMath.ConjugateTranspose(x);
var z = MyMath.LeftDivide(x, y);
}
}
}
注意: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;
}
}
}
而不是:
double x;
int i;
foo(out x, out i, z);
namespace Foo
{
public class Test
{
public void Example()
{
var y = MyMath.ConjugateTranspose(x);
var z = MyMath.LeftDivide(x, y);
}
}
}
3.静态类的自动名称插入 在计算代码中无休止地重复数学.BlaBlaBla(),而不是直接简单地编写blabla,这是非常不吸引人的 当然,这可以通过在计算类中添加本地方法来包装Math.blabla来解决。无论如何,如果不存在任何歧义,或者使用某种
隐式关键字来解决歧义,则最好在需要时自动插入类名
例如:
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)
{
...
}
}
*编译器可能只是生成一个警告,指出它解决了歧义,因为定义了隐式解决方案
注:3)对于解决2)来说已经足够令人满意了。我将是最早支持主流C#的人之一,它可以被用户扩展。然而,出于几个原因(设计、时间或成本效益),我认为C#不能像您()所希望的那样具有可扩展性。我发现一种C#派生的语言非常适合元编程,扩展功能/语法是非常有用的
是另一种具有良好元编程功能的.NET语言。然而,它已经远远地远离了C,我没有认为它是对这个问题的适当回答(但是无论如何都把它添加到完整性中)。根据我的经验,我发现F比C更适合于面向科学/数学的代码
第一个场景包含了元组;您可以编写一个函数,如let f a b=(a+b,a-b)
,它直接返回一个由2个值组成的元组,您可以相当轻松地添加或添加自己的值,模块可以帮助您完成第3个值。而F#与C#的互操作相当顺利,因此您甚至可以选择F#作为实用部分,并将其余代码保留在C#中。还有其他一些细节对科学代码(例如)也很有用 米格尔·德·伊卡扎想要C#too Effot==很多很多很多的元组。增益==几乎为零。除非你想成为你所从事的任何编程项目中唯一的程序员,否则这是一个糟糕的想法。(你将消灭工具支持(即Resharper),你将使任何合格的C#程序员突然不合格地使用他最喜欢的语言,没有人能够进来阅读你的代码,没有重构,列表是无止境的。)“静态类的自动名称插入”——使用静态函数而不使用类限定符,支持Java语言;不过,我并不是说这完全是一件好事/坏事:我认为它们都是好主意。我认为试图扩展C#来支持他们是不可能的。还有其他语言构建在CLR/JVM运行时上。。。其中一个对你来说可能更有趣(或更实用)。然而,不应忽视C#背后的工具支持:正如我更喜欢Scala(例如),对C#的ReSharper和VS支持使C#在我的日常工作中“遥遥领先”。如果你想在Dotnet中使用此功能,你应该使用Boo语言而不是C#。你可以用C#编写你的库,并在Boo中为它构建语法糖,尽管我记得Boo中已经支持元组,而且宏或管道步骤可以启用你建议的变体。哦,Nemrele!它面临着我在评论中概述的所有问题。C#并不是一种糟糕的语言,它需要一个与之相当的咖啡脚本。我肯定OP没有考虑用晦涩的语法糖替换他工作场所的所有C#代码(我当然没有)。有时有些问题或常用场景(比如DSL)需要这样的扩展性。一个模块可以充分利用它,而其他模块可以使用香草C。用自以为是的反应来总结这些问题似乎是对我的阻碍。“我同意允许无限的扩展回到C/C++宏和陷阱(我已经考虑过从方法扩展和系统中滥用)。至少对于第1)点和第3)点,我认为这可能是一种有用的语法糖,可以与主流C#集成,并且可能对每个开发人员(无论他们的工作领域如何)都有好处。使用另一种.net语言,我可以轻松编写数学代码,并将其与C#、VB或其他任何不错的方法中的应用程序的其余部分联系起来(这就是我目前通过从C#调用MatlabRuntime所做的,即使这是一个相当繁重的过程)。我将更深入地了解F,看看它如何适合我的问题。谢谢:)