Nhiệm vụ của bạn là giải quyết một tính năng cho ngôn ngữ lập trình, bằng cách triển khai một thư viện rất thông minh hoặc bằng cách xử lý văn bản đầu vào và / hoặc điều chỉnh quá trình biên dịch.
Ý tưởng:
- Thêm bản trình bày kiểu PHP xen kẽ vào C (ví dụ
<?c printf("Hello,"); ?> world!
). - Thêm một toán tử hợp nhất null vào một trong những ngôn ngữ không phải là C #.
- Thêm macro vào PHP.
- Thêm
goto
vào JavaScript. - Thêm khớp mẫu cho ngôn ngữ X.
- Thêm hỗ trợ không gian tên cho một ngôn ngữ không có ngôn ngữ đó.
- Làm cho C trông giống như PHP.
- Làm cho Haskell trông giống như Pascal.
- ... (Hãy đăng ý tưởng trong phần bình luận)
Quy tắc:
- Mang một cái gì đó lên bàn. Đừng chỉ nói "Mẫu Haskell" để thêm các tiện ích siêu lập trình vào Haskell. Đây không phải là StackOverflow.
- Toàn bộ việc thực hiện phải phù hợp với một màn hình (không tính ví dụ).
- Không lưu trữ mã trên một trang web bên ngoài đặc biệt cho nhiệm vụ này.
- Các tính năng ấn tượng hoặc đáng ngạc nhiên nhất chiến thắng.
Đừng lo lắng về việc triển khai tính năng chính xác 100%. Cách xa nó! Thách thức chính là tìm ra những gì bạn muốn làm và luẩn quẩn cắt giảm chi tiết cho đến khi công việc theo kế hoạch của bạn trở nên khả thi.
Thí dụ:
Thêm một toán tử lambda vào ngôn ngữ lập trình C.
Tiếp cận ban đầu:
Được rồi, tôi biết tôi muốn sử dụng libgc vì vậy lambdas của tôi sẽ giải quyết các vấn đề funarg lên và xuống. Tôi đoán điều đầu tiên tôi cần làm là viết / tìm một trình phân tích cú pháp cho ngôn ngữ lập trình C, sau đó tôi cần tìm hiểu tất cả về hệ thống loại C. Tôi phải tìm ra làm thế nào để hiểu ý nghĩa của nó cho đến khi các loại đi. Tôi sẽ cần phải thực hiện suy luận kiểu hay đơn giản là tôi nên yêu cầu tham số chính thức được gõ như đã cho? Thế còn tất cả những tính năng điên rồ trong CI chưa biết đến thì sao?
Rõ ràng là việc triển khai lambda trong C một cách chính xác sẽ là một công việc to lớn. Hãy quên đi sự đúng đắn! Đơn giản hóa, đơn giản hóa.
Tốt hơn:
Vặn vít lên, ai cần em? Tôi có thể có thể làm điều gì đó khó khăn với của GNU C chức năng lồng nhau và biểu thức tuyên bố . Tôi muốn thể hiện một chuyển đổi cú pháp tuyệt vời trên C với mã ngắn gọn, mãnh liệt, nhưng tôi thậm chí sẽ không cần một trình phân tích cú pháp cho việc này. Điều đó có thể chờ đợi một ngày khác.
Kết quả (yêu cầu GCC):
#include <stdio.h>
#include <stdlib.h>
#define lambda(d,e)({d;typeof(e)f(d){return(e);};f;})
#define map(F,A)({typeof(F)f=(F);typeof(*(A))*a=(A);({int i,l=((int*)(a))[-1]; \
typeof(f(*a))*r=(void*)((char*)malloc(sizeof(int)+l*sizeof(*r))+sizeof(int)); \
((int*)r)[-1]=l;for(i=0;i<l;i++)r[i]=f(a[i]);r;});})
#define convert_to(T) lambda(T x, x)
#define print(T, fmt) lambda(T x, printf(fmt "\n", x))
int main(void)
{
int *array = 1 + (int[]){10, 1,2,3,4,5,6,7,8,9,10};
map(print(int, "%d"), array);
double *array2 = map(lambda(int x, (double)x * 0.5), array);
map(print(double, "%.1f"), array2);
long *array3 = map(convert_to(long), array2);
map(print(long, "%ld"), array3);
long product = 1;
map(lambda(int x, product *= x), array);
printf("product: %ld\n", product);
return 0;
}
Điều đó thật dễ dàng phải không? Tôi thậm chí đã ném vào một map
macro để làm cho nó hữu ích và đẹp.