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. 자동 이름 정적 클래스

그것은 끝없이 직접 쓰는 대신 계산 코드에서 사방) 수학 .BlaBlaBla를 (반복 매우 호소력이의에 대한 삽입 및 단순히 BL aBlaBla.

로컬 클래스를 추가하여 계산 클래스 내에 수학 .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

Miguel de Icaza는 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

오 네므레! 그것은 내 의견에서 설명한 동일한 문제로 고통받습니다. C#은 Coffeescript와 동등한 끔찍한 언어는 아닙니다. –

+1

나는 OP가 모든 직장에서의 C# 코드를 암호 문학적 설탕으로 대체 할 생각이 없다고 확신한다. 그러한 확장 성을 필요로하는 문제 또는 일반적인 사용 시나리오 (DSL을 생각할 때가 있음) 가끔 있습니다. 나머지 모듈은 바닐라 C#에있을 수있는 반면, 한 모듈은 뛰어난 사용을 위해이를 활용할 수 있습니다. 그러한 질문을 찬찬히 응답으로 요약 해내는 것은 나에게 진보를 좌절시키는 것처럼 보인다. – Ani

+0

답장을 보내 주셔서 감사합니다 :) – CitizenInsane

7

C# 대신 F #을 사용 해본 적이 있습니까? 내 경험에 비추어 볼 때 F #은 C#보다 과학/수학 중심의 코드에 매우 적합하다는 것을 알았습니다.

첫 번째 시나리오는 튜플로 덮여 있습니다. let f a b = (a+b, a-b)과 같은 함수를 작성할 수 있습니다.이 값은 2 개의 값을 직접 반환합니다. overload operators을 쉽게 추가하거나 추가 할 수 있으며, 모듈이 3 번째로 도움이 될 수 있습니다. 또한 F #은 C#과 원활하게 상호 운용되므로 실용적인 부분에 대해 F #을 선택하고 나머지 코드는 C#으로 유지할 수 있습니다. 과학적 코드 (예 : units of measure)에도 잘 작동하는 다른 유용한 정보가 있습니다.

+0

다른 .net 언어를 사용하면 수학 코드를 쉽게 작성할 수 있고 C#, VB 또는 기타 좋은 접근 방식으로 응용 프로그램의 나머지 부분과 묶을 수 있습니다 (현재 C#에서 MatlabRuntime을 호출하여 수행하고있는 작업입니다. 무거운 과정). F #에 대해 자세히 살펴볼 것이므로 내 문제와 어떻게 부합되는지 살펴보십시오. 감사 :) – CitizenInsane