Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 扩展C语言,付出了多少努力/收获了多少? 介绍_C# - Fatal编程技术网

C# 扩展C语言,付出了多少努力/收获了多少? 介绍

C# 扩展C语言,付出了多少努力/收获了多少? 介绍,c#,C#,作为一名开发人员,我每天都要编写大量数学代码,我想在C语言中添加很少的语法糖分,以简化代码编写和审查 我已经阅读了关于这一点和其他可能的解决方案,只想知道哪一个方向最好,以及只解决以下三个语法问题需要付出多少努力* *:我可以在没有语法糖的情况下生存下来,但如果没有太多的工作和Rube-Goldberg设计的简单编译过程,进一步研究可能会很有趣 1.多个输出参数 我想写: [double x, int i] = foo(z); 而不是: double x; int i; foo(out

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

我已经阅读了关于这一点和其他可能的解决方案,只想知道哪一个方向最好,以及只解决以下三个语法问题需要付出多少努力*

*:我可以在没有语法糖的情况下生存下来,但如果没有太多的工作和Rube-Goldberg设计的简单编译过程,进一步研究可能会很有趣

1.多个输出参数 我想写:

 [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,看看它如何适合我的问题。谢谢:)