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).
Miguel de Icaza cũng muốn tuple trong C# quá http://tirania.org/blog/archive/2009/Dec-23.html –
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.) –
"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 –