งานของคุณคือการแก้ไขคุณลักษณะของภาษาโปรแกรมโดยการนำไลบรารี่ที่ฉลาดมากหรือโดยการประมวลผลข้อความอินพุตและ / หรือปรับแต่งกระบวนการรวบรวม
ไอเดีย:
- เพิ่มงานนำเสนอสไตล์ PHP interleaving ไปที่ C (เช่น
<?c printf("Hello,"); ?> world!
) - เพิ่มโอเปอเรเตอร์การรวมตัวกันเป็นโมฆะในภาษาเหล่านั้นที่ไม่ใช่ C #
- เพิ่มมาโครใน PHP
- เพิ่ม
goto
ไปยัง JavaScript - เพิ่มการจับคู่รูปแบบเป็นภาษา X
- เพิ่มการสนับสนุน namespace ให้กับภาษาที่ไม่มี
- ทำให้ C ดูเหมือน PHP
- ทำให้ Haskell ดูเหมือน Pascal
- ... (อย่าลังเลที่จะโพสต์แนวคิดในส่วนความคิดเห็น)
กฎ:
- นำสิ่งที่จะตาราง อย่าเพียงแค่พูดว่า "เทมเพลตแฮสเค็ลล์" เพื่อเพิ่มเครื่องมืออำนวยความสะดวกในการ metaprogramming ให้กับแฮสเคลล์ นี่ไม่ใช่ StackOverflow
- การใช้งานทั้งหมดควรจะพอดีในหนึ่งหน้าจอ (ไม่นับตัวอย่าง)
- อย่าโฮสต์รหัสบนไซต์ภายนอกโดยเฉพาะสำหรับงานนี้
- คุณสมบัติที่น่าประทับใจหรือน่าประหลาดใจที่สุดชนะ
ไม่ต้องกังวลกับการนำคุณลักษณะไปใช้อย่างถูกต้อง 100% ไกลจากมัน! ความท้าทายหลักคือการค้นหาว่าคุณต้องการทำอะไรและตัดรายละเอียดออกไปอย่างชั่วร้ายจนกว่าภารกิจที่คุณวางแผนไว้จะเป็นไปได้
ตัวอย่าง:
เพิ่มตัวดำเนินการแลมบ์ดาในภาษาการเขียนโปรแกรม C
วิธีการเริ่มต้น:
โอเคฉันรู้ว่าฉันต้องการใช้libgcดังนั้นลูกแกะของฉันจะแก้ปัญหา funarg ที่ขึ้นและลง ฉันเดาสิ่งแรกที่ฉันต้องทำคือเขียน / หา parser สำหรับภาษาการเขียนโปรแกรม C จากนั้นฉันจะต้องเรียนรู้ทั้งหมดเกี่ยวกับระบบชนิดของ C ฉันต้องหาวิธีที่จะเข้าใจมันให้ดีที่สุดเท่าที่จะเป็นไปได้ ฉันจะต้องใช้การอนุมานประเภทหรือฉันควรเพียงต้องการให้พิมพ์พารามิเตอร์ที่เป็นทางการตามที่กำหนด? แล้วฟีเจอร์ที่บ้าคลั่งเหล่านี้ใน CI ยังไม่รู้อะไรบ้าง?
เป็นที่ชัดเจนว่าการใช้แลมบ์ดาใน C อย่างถูกต้องจะเป็นเรื่องใหญ่ ลืมความถูกต้องไปเสีย! ลดความซับซ้อนลดความซับซ้อน
ที่ดีกว่า:
สกรู funargs ขึ้นใครต้องการ 'em ฉันอาจจะสามารถที่จะทำบางสิ่งบางอย่างที่หากินกับ GNU ซีฟังก์ชั่นที่ซ้อนกันและการแสดงออกทางคำสั่ง ฉันต้องการแสดงการแปลงทางวากยสัมพันธ์ที่น่าทึ่งใน C ด้วยรหัสตัวย่อ, แฮ็ค แต่ฉันไม่จำเป็นต้องใช้โปรแกรมแยกวิเคราะห์สำหรับเรื่องนี้ ที่สามารถรออีกวัน
ผลลัพธ์ (ต้องมี 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;
}
นั่นเป็นเรื่องง่ายใช่มั้ย ฉันยังขว้างmap
มาโครเพื่อให้มีประโยชน์และสวย