Tugas Anda adalah untuk menempelkan fitur ke bahasa pemrograman, baik dengan menerapkan pustaka yang sangat pintar, atau dengan memproses teks input dan / atau mengubah proses kompilasi.
Ide ide:
- Tambahkan presentasi PHP-style interleaving ke C (mis
<?c printf("Hello,"); ?> world!
). - Tambahkan operator penggabungan nol ke salah satu bahasa yang bukan C #.
- Tambahkan makro ke PHP.
- Tambahkan
goto
ke JavaScript. - Tambahkan pencocokan pola ke bahasa X.
- Tambahkan dukungan namespace ke bahasa yang tidak memilikinya.
- Buat C terlihat seperti PHP.
- Buat Haskell terlihat seperti Pascal.
- ... (jangan ragu untuk mengirim ide di bagian komentar)
Aturan:
- Bawa sesuatu ke meja. Jangan hanya mengatakan "Templat Haskell" untuk menambahkan fasilitas metaprogramming ke Haskell. Ini bukan StackOverflow.
- Seluruh implementasi harus sesuai dalam satu layar penuh (tidak termasuk contoh).
- Jangan meng-host kode di situs eksternal khusus untuk tugas ini.
- Fitur yang paling mengesankan atau mengejutkan menang.
Jangan khawatir tentang penerapan fitur 100% dengan benar. Jauh dari itu! Tantangan utama adalah mencari tahu apa yang ingin Anda lakukan dan dengan kejam memotong detail sampai usaha yang Anda rencanakan menjadi layak.
Contoh:
Tambahkan operator lambda ke bahasa pemrograman C.
Pendekatan awal:
Oke, saya tahu saya ingin menggunakan libgc sehingga lambda saya akan memecahkan masalah funarg ke atas dan ke bawah. Saya kira hal pertama yang perlu saya lakukan adalah menulis / menemukan parser untuk bahasa pemrograman C, maka saya harus belajar semua tentang sistem tipe C. Saya harus mencari cara untuk memahami sejauh jenis pergi. Apakah saya perlu menerapkan inferensi tipe, atau haruskah saya meminta agar parameter formal diketik seperti yang diberikan? Bagaimana dengan semua fitur gila di CI yang belum Anda ketahui?
Cukup jelas bahwa mengimplementasikan lambda di C dengan benar akan menjadi usaha yang sangat besar. Lupakan kebenaran! Sederhanakan, sederhanakan.
Lebih baik:
Persetan funargs ke atas, siapa yang butuh mereka? Saya mungkin bisa melakukan sesuatu yang rumit dengan fungsi bersarang GNU C dan ekspresi pernyataan . Saya ingin memamerkan transformasi sintaksis yang luar biasa pada C dengan kode pendek, kasar, tetapi saya bahkan tidak perlu parser untuk ini. Itu bisa menunggu satu hari lagi.
Hasil (membutuhkan 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;
}
Itu mudah, bukan? Saya bahkan melempar map
makro untuk membuatnya berguna dan cantik.