Введение
Как разработчик, я участвую в написании много математического кода каждый день, и я бы хотел добавить очень мало синтаксического сахара на язык C# для облегчения написания и анализа кода.Расширение языка C#, сколько усилий/усиления?
Я уже читал об этом thread и этом другом one для возможных решений и хотел бы просто узнать, какое наилучшее направление и сколько усилий он может решить, чтобы решить только три следующие синтаксические проблемы *.
*: Я могу выжить без описанных синтаксических сахаров, но если это не так много работы и Rube-Goldberg дизайн для простого процесса компиляции, может быть интересно исследовать дальше.
1. Аргументы Несколько выходных
Я хотел бы написать:
[double x, int i] = foo(z);
Вместо:
double x;
int i;
foo(out x, out i, z);
NB: 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. Автоматическая вставка имени для статических классов
Это крайне непривлекательным бесконечно повторять Math .BlaBlaBla() везде в коде вычисления вместо того, чтобы писать прямо и просто Bl aBlaBla.
Это можно решить, добавив локальные методы для обертывания 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
решение было определено.
NB: 3) удовлетворяет достаточно для решения 2).
Мигель де Иказа тоже хотел кортеж на C# http://tirania.org/blog/archive/2009/Dec-23.html –
Effot == много и много. Прибыль == почти нулевая. Если вы не хотите быть одиноким программистом в любом проекте программирования, который вы преследуете, это ужасная идея. (вы аннулируете поддержку инструментария (например, Resharper), вы сделаете любого квалифицированного программиста на C# неожиданно неквалифицированным, чтобы использовать его любимый язык, никто не сможет войти и прочитать ваш код, без рефакторинга, список бесконечен.) –
«Автоматическая вставка имени для статических классов» - использование статической функции без квалификатора класса, поддерживаемой на Java; Я не говорю, что это очень хорошо/плохо: http://www.deitel.com/articles/java_tutorials/20060211/index.html –