Introduzione
Come sviluppatore, io sono coinvolto a scrivere un sacco di codice matematico di tutti i giorni e mi piacerebbe aggiungere pochissimi zucchero sintattico per il linguaggio C# per facilitare la scrittura del codice e la revisione.Estensione del linguaggio C#, quanto sforzo/guadagno?
Ho già letto su questoe questo altro one per possibili soluzioni e vorrei semplicemente sapere quale direzione migliore andare e quanto sforzo può rappresentare per risolvere solo per i tre problemi sintattici seguenti *.
*: posso sopravvivere senza zuccheri sintattiche descritte, ma se non è troppo lavoro e Rube Goldberg- progetto per semplice processo di compilazione, può essere interessante per indagare ulteriormente.
1. Argomenti multipli uscita
mi piacerebbe scrivere:
[double x, int i] = foo(z);
Invece di:
double x;
int i;
foo(out x, out i, z);
NB: out
parametri di essere immessi prima e foo
essere dichiarato come al solito (o usando lo stesso tipo di sintassi).
2. Gli operatori sono inoltre
Mi piacerebbe avere un paio di nuovi operatori unari/binari. Non so molto come definire per queste (e sembra piuttosto complessa per non introdurre l'ambiguità quando analizza le fonti), in ogni caso vorrebbe avere qualcosa di simile:
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;
}
}
}
Invece di:
namespace Foo
{
public class Test
{
public void Example()
{
var y = MyMath.ConjugateTranspose(x);
var z = MyMath.LeftDivide(x, y);
}
}
}
3. inserimento nome automatico per classi statiche
è estremamente sgradevole a ripetere all'infinito Math .BlaBlaBla() ovunque in un codice di calcolo invece di scrivere direttamente e semplicemente Bl aBlaBla.
Sicuramente questo può essere risolto aggiungendo metodi locali per avvolgere Math .BlaBlaBla all'interno della classe di calcolo. In ogni caso, sarebbe meglio quando non c'è alcuna ambiguità o quando l'ambiguità sarebbe risolta con una qualche parola chiave implicit
, per inserire automaticamente i nomi delle classi quando richiesto.
Ad esempio:
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)
{
...
}
}
diventerebbe:
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)
{
...
}
}
* Il compilatore può semplicemente generare un avviso per indicare che risolve l'ambiguità perché una soluzione implicit
è stato definito.
NB: 3) è abbastanza soddisfacente per risolvere 2).
Miguel de Icaza voleva la tupla anche in C# http://tirania.org/blog/archive/2009/Dec-23.html –
Effot == lotti e lotti. Guadagno == quasi zero. A meno che tu non voglia essere il programmatore solitario in qualunque progetto di programmazione tu persegua, questa è una pessima idea. (distruggerai il supporto per gli strumenti (es. Resharper), farai improvvisamente non qualificato un programmatore C# qualificato per usare la sua lingua preferita, nessuno potrà entrare e leggere il tuo codice, nessun refactoring, la lista è infinita.) –
"Inserimento automatico dei nomi per le classi statiche": utilizzo della funzione statica senza qualificatore di classe, supportato in Java; Non sto dicendo che sia esattamente una cosa buona/cattiva però: http://www.deitel.com/articles/java_tutorials/20060211/index.html –