2012-05-27 2 views
8

Введение

Как разработчик, я участвую в написании много математического кода каждый день, и я бы хотел добавить очень мало синтаксического сахара на язык 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).

+0

Мигель де Иказа тоже хотел кортеж на C# http://tirania.org/blog/archive/2009/Dec-23.html –

+7

Effot == много и много. Прибыль == почти нулевая. Если вы не хотите быть одиноким программистом в любом проекте программирования, который вы преследуете, это ужасная идея. (вы аннулируете поддержку инструментария (например, Resharper), вы сделаете любого квалифицированного программиста на C# неожиданно неквалифицированным, чтобы использовать его любимый язык, никто не сможет войти и прочитать ваш код, без рефакторинга, список бесконечен.) –

+0

«Автоматическая вставка имени для статических классов» - использование статической функции без квалификатора класса, поддерживаемой на Java; Я не говорю, что это очень хорошо/плохо: http://www.deitel.com/articles/java_tutorials/20060211/index.html –

ответ

3

Я был бы одним из первых людей, поддерживающих основной C#, который может быть расширен пользователями. Однако - по нескольким причинам (дизайн, время или стоимость) я не вижу, чтобы C# был настолько расширяемым, как вы (or I). C# -уложенный язык, который я нашел, который очень хорош для метапрограммирования и расширения функциональности/синтаксиса Nemerle.

Boo - это еще один язык .NET с хорошими функциями метапрограммирования. Тем не менее, он настолько удален от C#, что я не счел его подходящим ответом на этот вопрос (но добавил его для полноты, в любом случае).

+2

Oh Nemrele! Он страдает от всех тех же проблем, которые я изложил в своем комментарии. C# не такой ужасный язык, что ему нужен эквивалент Coffeescript. –

+1

Я уверен, что OP не думал о замене всего кода C# на своем рабочем месте загадочным синтаксическим сахаром (я, конечно, не был). Иногда возникают проблемы или сценарии общего использования (думаю, DSL), которые нуждаются в такой расширяемости. Один модуль может использовать его для ОТЛИЧНОГО использования, в то время как остальное может быть в ваниле C#. В целом, увольнение таких вопросов с упрямыми ответами кажется мне для меня препятствующим продвижению. – Ani

+0

Спасибо за ваш ответ :) – CitizenInsane

7

Вы считали, что используете F # вместо C#? По моему опыту, я нашел F # отлично подходящим для научного/математического ориентированного кода, а не C#.

Ваш первый сценарий покрыт кортежами; вы можете написать такую ​​функцию, как let f a b = (a+b, a-b), которая возвращает кортеж из двух значений напрямую, вы можете довольно легко overload operators или добавить свой собственный, а модули могут помочь вам с 3-м. И F # взаимодействует довольно плавно с C#, поэтому вы даже можете выбрать F # для тех частей, где это практично, и сохранить остальную часть вашего кода на C#. Есть и другие тонкости, которые отлично подходят для научного кода (units of measure например), а также ...

+0

Наличие другого языка .net, где я могу легко написать математический код и связать его с остальной частью приложения в C#, VB или любым другим способом. Это то, что я сейчас делаю, вызывая MatlabRuntime с C#, даже если довольно тяжелый процесс). У меня будет более глубокий взгляд на F #, чтобы посмотреть, как он может соответствовать моим проблемам. Благодаря :) – CitizenInsane

Смежные вопросы