序章
開発者として、私は毎日多くの数学コードの作成に携わっており、コードの作成とレビューを容易にするために、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) を解決するのに十分満足です。