Göreviniz bir programlama dili için, çok akıllı bir kütüphane uygulayarak veya giriş metnini işleyerek ve / veya derleme işlemini ayarlayarak bir özelliği ele almaktır.
fikirler:
- PHP'ye serpiştirme sunumunu C'ye (örn.
<?c printf("Hello,"); ?> world!
) Ekleyin . - Boş bir birleştirme işleci C # olmayan dillerden birine ekleyin .
- PHP'ye makrolar ekleyin.
goto
JavaScript'e ekle .- X diline kalıp eşleştirme ekleyin
- Sahip olmayan bir dile isim alanı desteği ekleyin.
- C'yi PHP gibi görünmesini sağlayın.
- Haskell'i Pascal gibi göster.
- ... (yorum bölümüne fikir göndermekten çekinmeyin)
Kurallar:
- Masaya bir şey getir. Sadece Haskell'e metaprogramlama olanakları eklemek için "Şablon Haskell" deme. Bu StackOverflow değil.
- Tüm uygulama bir ekrana sığmalıdır (örneği saymaz).
- Kodu özellikle bu görev için harici bir sitede barındırmayın.
- En etkileyici ya da şaşırtıcı özellik kazanır.
Özelliği% 100 doğru uygulamak konusunda endişelenmeyin. Ne münasebet! Asıl zorluk, ne yapmak istediğinizi bulmak ve planlı girişiminiz uygulanabilir hale gelinceye kadar ayrıntılara şiddetle uymamak.
Örnek:
C programlama diline bir lambda operatörü ekleyin .
İlk yaklaşım:
Tamam, libgc kullanmak istediğimi biliyorum, böylece lambdalarım yukarı ve aşağı funarg sorunlarını çözecek. Sanırım yapmam gereken ilk şey C programlama dili için bir ayrıştırıcı yazmak / bulmak, sonra da C'nin tip sistemi hakkında her şeyi öğrenmem gerekiyor. Türler kadarıyla nasıl bir anlam çıkaracağını bulmak zorunda kalacağım. Tip çıkarımı yapmam gerekir mi yoksa basitçe formal parametrenin verildiği gibi yazılmasını mı talep etmeliyim? Peki ya CI’daki şu çılgın özellikler henüz bilmiyor?
C'ye lambda'yı doğru uygulamanın çok büyük bir girişim olacağı açıktır . Doğruluğunu unut! Basitleştirin, basitleştirin.
Daha iyi:
İhtiyacı olan yukarı hunileri boşver. GNU C'nin iç içe geçmiş işlevleri ve deyim ifadeleri ile zor bir şey yapabilirim . C'de şaşkın ve sahte kod ile inanılmaz bir sözdizimsel dönüşüm göstermek istedim, ancak bunun için bir çözümleyiciye bile ihtiyacım olmayacak. Başka bir gün bekleyebilir.
Sonuç (GCC gerektirir):
#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;
}
Bu kolaydı, değil mi? map
Kullanışlı ve güzel olması için bir makroya bile attım .