Ihre Aufgabe ist es, ein Feature in eine Programmiersprache zu integrieren, indem Sie entweder eine sehr clevere Bibliothek implementieren oder den eingegebenen Text verarbeiten und / oder den Kompilierungsprozess optimieren.
Ideen:
- Fügen Sie C eine PHP-artige Präsentationsverschachtelung hinzu (zB
<?c printf("Hello,"); ?> world!
). - Fügen Sie einer der Sprachen, die nicht C # sind, einen Null-Vereinigungsoperator hinzu .
- Fügen Sie PHP Makros hinzu.
- Fügen Sie
goto
JavaScript hinzu. - Füge die Musterübereinstimmung zu Sprache X hinzu.
- Hinzufügen von Namespace-Unterstützung zu einer Sprache, in der dies nicht der Fall ist.
- Stellen Sie sicher, dass C wie PHP aussieht.
- Lass Haskell wie Pascal aussehen.
- ... (zögern Sie nicht, Ideen im Kommentarbereich zu posten)
Regeln:
- Bring etwas zum Tisch. Sagen Sie nicht einfach "Template Haskell", um Haskell Metaprogrammierfunktionen hinzuzufügen. Dies ist kein StackOverflow.
- Die gesamte Implementierung sollte in einen Bildschirm passen (ohne das Beispiel zu zählen).
- Hosten Sie Code nicht speziell für diese Aufgabe auf einer externen Site.
- Das beeindruckendste oder überraschendste Feature gewinnt.
Machen Sie sich keine Sorgen, wenn Sie die Funktion zu 100% korrekt implementieren. Weit davon entfernt! Die größte Herausforderung besteht darin, herauszufinden, was Sie tun möchten, und Details bösartig auszuschneiden, bis Ihr geplantes Unternehmen durchführbar wird.
Beispiel:
Fügen Sie der Programmiersprache C einen Lambda-Operator hinzu .
Anfänglicher Ansatz:
Okay, ich weiß, dass ich libgc verwenden möchte, damit meine Lambdas die Aufwärts- und Abwärts-Funarg-Probleme lösen. Ich denke, das erste, was ich tun müsste, ist, einen Parser für die Programmiersprache C zu schreiben / zu finden. Dann müsste ich alles über das Typensystem von C lernen. Ich müsste herausfinden, wie ich es verstehen kann, wenn es um Typen geht. Muss ich eine Typinferenz implementieren oder muss ich einfach nur den formalen Parameter wie angegeben eingeben? Was ist mit all den verrückten Funktionen in CI, von denen ich noch nichts weiß?
Es ist ziemlich klar, dass die korrekte Implementierung von Lambda in C ein großes Unterfangen wäre. Vergiss die Korrektheit! Vereinfachen, vereinfachen.
Besser:
Wer braucht sie? Ich könnte in der Lage sein, mit den verschachtelten Funktionen und Anweisungsausdrücken von GNU C etwas heikles zu machen . Ich wollte eine erstaunliche syntaktische Transformation in C mit knappem, hackigem Code demonstrieren, aber ich brauche dafür nicht einmal einen Parser. Das kann auf einen anderen Tag warten.
Ergebnis (erfordert 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;
}
Das war doch einfach, oder? Ich habe sogar ein map
Makro eingefügt, um es nützlich und hübsch zu machen.