2012-05-27 39 views
8

Giới thiệu

Là nhà phát triển, tôi tham gia viết nhiều mã toán học hàng ngày và tôi muốn thêm rất ít cú pháp vào ngôn ngữ C# để dễ viết và viết mã.Mở rộng ngôn ngữ C#, nỗ lực/đạt được bao nhiêu?

Tôi đã đọc về điều này thread và điều này khác one cho các giải pháp khả thi và đơn giản là muốn biết hướng đi nào tốt nhất và bao nhiêu nỗ lực có thể đại diện để giải quyết chỉ cho ba vấn đề cú pháp sau *.

*: Tôi có thể sống sót mà không cần mô tả các loại đường cú pháp, nhưng nếu nó không quá nhiều công việc và thiết kế cho quá trình biên dịch đơn giản, có thể sẽ rất thú vị để điều tra thêm.

1. Nhiều đối số đầu ra

Tôi muốn viết:

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

Thay vì:

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

NB: out thông số được đặt đầu tiên và foo được tuyên bố như thường lệ (hoặc sử dụng cùng một loại cú pháp).

2. Nhà khai thác bổ sung

Tôi muốn có một vài toán tử đơn/nhị phân mới. Không biết nhiều cách định nghĩa cho các (và nó có vẻ khá phức tạp vì không giới thiệu mơ hồ khi phân tích nguồn), dù sao muốn có cái gì đó như:

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

Thay vì:

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

3. Chèn tên tự động cho các lớp tĩnh

Thật vô cùng hấp dẫn khi lặp lại không ngừng Toán .BlaBlaBla() ở mọi nơi trong mã tính toán thay vì viết trực tiếp và chỉ đơn giản là Bl aBlaBla.

Để chắc chắn điều này có thể được giải quyết bằng cách thêm phương pháp cục bộ để bọc Math .BlaBlaBla bên trong lớp tính toán. Dù sao thì sẽ tốt hơn khi không có sự mơ hồ chút nào, hoặc khi sự mơ hồ sẽ được giải quyết với một số loại từ khóa implicit, để tự động chèn tên lớp khi cần.

Ví dụ:

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

Sẽ trở thành:

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

* Trình biên dịch chỉ đơn giản là có thể tạo ra một cảnh báo để cho biết rằng nó đã giải quyết sự mơ hồ vì một giải pháp implicit đã được xác định.

NB: 3) đủ thỏa mãn để giải quyết 2).

+0

Miguel de Icaza cũng muốn tuple trong C# quá http://tirania.org/blog/archive/2009/Dec-23.html –

+7

Effot == rất nhiều và rất nhiều. Đạt được == gần như bằng không. Trừ khi bạn muốn trở thành lập trình viên duy nhất trong bất kỳ dự án lập trình nào bạn theo đuổi, đây là một ý tưởng khủng khiếp. (bạn sẽ hủy bỏ công cụ hỗ trợ (tức là Resharper), bạn sẽ làm cho bất kỳ trình lập trình C# nào đủ điều kiện sử dụng ngôn ngữ ưa thích của mình, không ai có thể vào và đọc mã của bạn, không có refactorings, danh sách là vô tận.) –

+0

"Chèn tên tự động cho các lớp tĩnh" - sử dụng hàm tĩnh mà không có trình phân loại lớp, được hỗ trợ trong Java; Tôi không nói rằng đó chính xác là một điều tốt/xấu mặc dù: http://www.deitel.com/articles/java_tutorials/20060211/index.html –

Trả lời

3

Tôi muốn trở thành một trong những người đầu tiên hỗ trợ C# chính thống có thể được người dùng mở rộng. Tuy nhiên - vì nhiều lý do (thiết kế, thời gian hoặc lợi ích chi phí), tôi không thể thấy C# có thể mở rộng như bạn (or I) muốn. Một ngôn ngữ C# -derived Tôi đã tìm thấy rằng RẤT tốt cho meta-lập trình và mở rộng chức năng/cú pháp là Nemerle.

Boo là một ngôn ngữ .NET khác có tính năng lập trình meta tốt. Tuy nhiên, nó cho đến nay đã được gỡ bỏ từ C# mà tôi đã không xem xét nó một câu trả lời thích hợp cho câu hỏi này (nhưng thêm nó cho đầy đủ, anyway).

+2

Oh Nemrele! Nó bị tất cả những vấn đề tương tự tôi nêu trong bình luận của tôi. C# không phải là một ngôn ngữ khủng khiếp như vậy mà nó cần một tương đương Coffeescript. –

+1

Tôi chắc chắn rằng OP không nghĩ đến việc thay thế tất cả mã C# tại nơi làm việc của mình bằng đường cú pháp khó hiểu (tôi chắc chắn không phải). Đôi khi có vấn đề hoặc các kịch bản sử dụng chung (nghĩ rằng DSL) cần mở rộng như vậy. Một mô-đun có thể tận dụng nó để sử dụng EXCELLENT trong khi phần còn lại có thể ở trong vanilla C#. Hoàn toàn bác bỏ những câu hỏi như vậy với những phản ứng có ý kiến ​​dường như, để tôi không khuyến khích tiến bộ. – Ani

+0

Cảm ơn câu trả lời của bạn :) – CitizenInsane

7

Bạn đã cân nhắc sử dụng F # thay vì C# chưa? Theo kinh nghiệm của tôi, tôi đã tìm thấy F # phù hợp tuyệt vời cho mã định hướng khoa học/toán học, nhiều hơn so với C#.

Kịch bản đầu tiên của bạn được bao phủ bởi bộ dữ liệu; bạn có thể viết một hàm như let f a b = (a+b, a-b), trả về một bộ gồm 2 giá trị trực tiếp, bạn có thể dễ dàng overload operators hoặc thêm của riêng bạn và các mô-đun có thể giúp bạn với giá trị thứ ba. Và F # tương tác khá trơn tru với C#, vì vậy bạn thậm chí có thể chọn F # cho các phần mà nó thực tế và giữ phần còn lại của mã của bạn trong C#. Ngoài ra, còn có các loại niceties khác hoạt động tốt cho mã khoa học (ví dụ: units of measure) ...

+0

Có một ngôn ngữ .net khác mà tôi có thể viết mã toán học dễ dàng và gắn nó với phần còn lại của ứng dụng trong C#, VB hoặc bất cứ cách nào là một cách tiếp cận tốt đẹp (Đó là những gì tôi hiện đang làm bằng cách gọi MatlabRuntime từ C#, ngay cả khi khá quá trình nặng nề). Tôi sẽ có một cái nhìn sâu sắc hơn để F # để xem làm thế nào nó có thể phù hợp với các vấn đề của tôi. Cảm ơn :) – CitizenInsane

Các vấn đề liên quan