8

序章

開発者として、私は毎日多くの数学コードの作成に携わっており、コードの作成とレビューを容易にするために、C# 言語に構文糖衣をほとんど追加したくありません。

私はすでにこのスレッドと考えられる解決策について他のスレッドを読んでおり、次の 3の構文上の問題のみを解決するために、どの方向に進むべきか、そしてどれだけの労力がかかるかを知りたいだけです*。

*: シンタックス シュガーを記述しなくても生きていけるが、単純なコンパイル プロセスのための作業と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. 静的クラスの名前の自動挿入

直接単純にBlaBlaBlaを記述するのではなく、計算コードのいたるところでMath .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) を解決するのに十分満足です。

4

2 に答える 2

7

C# の代わりに F# を使用することを検討しましたか? 私の経験では、C# よりも F# が科学/数学指向のコードに非常に適していることがわかりました。

最初のシナリオはタプルでカバーされています。let f a b = (a+b, a-b)2 つの値のタプルを直接返す のような関数を作成できます。演算子を簡単にオーバーロードしたり、独自の演算子を追加したりできます。また、モジュールが 3 つ目の処理に役立つ場合があります。また、F# は C# と非常にスムーズに相互運用できるため、F# が実用的な部分だけを選択し、残りのコードは C# のままにしておくこともできます。科学的コード(たとえば 、測定単位)に最適な機能が他にもあります...

于 2012-05-27T05:10:40.437 に答える
3

私は、ユーザーが拡張できる主流の C# をサポートした最初の人物の 1 人です。ただし、いくつかの理由 (設計、時間、または費用対効果) により、C# があなた (または私) が望むほど拡張可能であるとは思えません。私が見つけた AC# 派生言語は、メタプログラミングと機能/構文の拡張に非常に適しているのはNemerleです。

Booは、優れたメタプログラミング機能を備えたもう 1 つの .NET 言語です。ただし、これは C# から遠く離れているため、この質問に対する適切な回答とは考えていません (ただし、完全を期すために追加しました)。

于 2012-05-27T01:43:37.993 に答える