2012-05-27 11 views
8

Introducción

Como desarrollador, estoy involucrado en escribir mucho código matemático todos los días y me gustaría añadir muy pocas azúcares sintácticas al lenguaje C# para facilitar la escritura y revisión de códigos.Extender el lenguaje C#, ¿cuánto esfuerzo/ganancia?

Ya he leído sobre este thread y este otro one para encontrar posibles soluciones y simplemente me gustaría saber qué dirección tomar y cuánto esfuerzo puede representar resolver solo para los tres problemas sintácticos siguientes *.

*: Puedo sobrevivir sin azúcares sintácticas descritos, pero si no es demasiado trabajo y Rube-Goldberg diseño de proceso de compilación sencilla, puede ser interesante para investigar más a fondo.

1. argumentos múltiple salida

me gustaría escribir:

[double x, int i] = foo(z); 

En lugar de:

double x; 
int i; 
foo(out x, out i, z); 

NB: out parámetros que se colocan primero y foo ser declaradas como de costumbre (o usando el mismo tipo de sintaxis).

2. Los operadores adicionales

me gustaría tener unos nuevos operadores unarios/binarios. No sé mucho cómo definir para estos (y parece bastante complejo para no introducir ambigüedad al analizar las fuentes), de todos modos le gustaría tener algo como:

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; 
     } 
    } 
} 

En lugar de:

namespace Foo 
{ 
    public class Test 
    { 
     public void Example() 
     { 
      var y = MyMath.ConjugateTranspose(x); 
      var z = MyMath.LeftDivide(x, y); 
     } 
    } 
} 

3. inserción automática de nombres para las clases estáticas

es muy poco atractivo para repetir sin cesar Matemáticas .BlaBlaBla() en todas partes de un código de computación en lugar de escribir directamente y simplemente Bl aBlaBla.

Seguro que esto puede ser resuelto agregando métodos locales para envolver Matemáticas .BlaBlaBla dentro de la clase de cálculo. De todos modos sería mejor cuando no hay ambigüedad en absoluto, o cuando la ambigüedad se resolvería con algún tipo de palabra clave implicit, para insertar automáticamente nombres de clase cuando sea necesario.

Por ejemplo:

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) 
    { 
     ... 
    } 
} 

se convertiría en:

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) 
    { 
     ... 
    } 
} 

* El compilador puede generar simplemente una advertencia para indicar que se resuelve la ambigüedad, porque una solución implicit se ha definido.

NB: 3) es lo suficientemente satisfactorio para resolver 2).

+0

Miguel de Icaza quería tupla en C# también http://tirania.org/blog/archive/2009/Dec-23.html –

+7

Effot == lotes y lotes. Ganancia == casi cero. A menos que quieras ser el único programador en cualquier proyecto de programación que persigas, esta es una idea terrible. (aniquilará el soporte de herramientas (es decir, Resharper), hará que cualquier programador de C# calificado no califique repentinamente para usar su idioma favorito, nadie podrá entrar y leer su código, no habrá refactorizaciones, la lista es interminable) –

+0

"Inserción automática de nombres para clases estáticas": uso de funciones estáticas sin el calificador de clase, compatible con Java; Sin embargo, no estoy diciendo que sea exactamente algo bueno/malo: http://www.deitel.com/articles/java_tutorials/20060211/index.html –

Respuesta

3

Sería una de las primeras personas en admitir un C# común que los usuarios pueden ampliar. Sin embargo, por varias razones (diseño, tiempo o costo-beneficio) no puedo ver que C# sea tan extensible como usted (or I) desea. Un lenguaje derivado de C# he encontrado que es MUY bueno para la meta-programación y la extensión de la funcionalidad/sintaxis es Nemerle.

Boo es otro lenguaje .NET con buenas características de meta-programación. Sin embargo, está tan alejado de C# que no lo consideré como una respuesta adecuada a esta pregunta (pero de todos modos lo agregué para completarlo).

+2

Oh Nemrele! Sufre de todos los mismos problemas que describí en mi comentario. C# no es un lenguaje tan horrible que necesita un equivalente de Coffeescript. –

+1

Estoy seguro de que OP no estaba pensando en reemplazar todo el código C# en su lugar de trabajo con azúcar sintáctica críptica (ciertamente no lo era). A veces hay problemas o escenarios de uso común (piense en DSL) que necesitan tal extensibilidad. Un módulo podría aprovecharlo para un uso EXCELENTE mientras que el resto podría ser C#. Descartar unánimemente tales preguntas con respuestas obstinadas parece, para mí, un avance desalentador. – Ani

+0

Gracias por su respuesta :) – CitizenInsane

7

¿Ha considerado utilizar F # en lugar de C#? En mi experiencia, he encontrado que F # es una excelente opción para el código orientado a la ciencia/matemática, más que C#.

Su primer caso está cubierto con tuplas; puede escribir una función como let f a b = (a+b, a-b), que devuelve una tupla de 2 valores directamente, puede fácilmente overload operators o agregar la suya propia, y los módulos pueden ayudarlo con la 3ra. Y F # interopera sin problemas con C#, por lo que incluso puede elegir F # para las partes donde es práctico, y mantener el resto de su código en C#. Hay otras sutilezas que funcionan muy bien para el código científico (units of measure por ejemplo) también ...

+0

Tengo otro idioma .net donde puedo escribir código matemático fácilmente y lo relacioné con el resto de la aplicación en C#, VB o lo que sea un buen enfoque (Eso es lo que estoy haciendo actualmente llamando a MatlabRuntime desde C#, incluso si es bastante proceso pesado). Tendré un vistazo más profundo a F # para ver cómo encaja con mis problemas. Gracias :) – CitizenInsane