Votre tâche consiste à intégrer une fonctionnalité à un langage de programmation, soit en implémentant une bibliothèque très astucieuse, soit en traitant le texte saisi et / ou en peaufinant le processus de compilation.
Idées:
- Ajoutez une présentation de type PHP entrelacée à C (par exemple
<?c printf("Hello,"); ?> world!
). - Ajoutez un opérateur de fusion nul à l'une de ces langues qui n'est pas C #.
- Ajouter des macros à PHP.
- Ajouter
goto
à JavaScript. - Ajoutez un motif correspondant à la langue X.
- Ajoutez la prise en charge des espaces de noms à une langue qui ne l’a pas.
- Faites en sorte que C ressemble à PHP.
- Faites ressembler Haskell à Pascal.
- ... (n'hésitez pas à poster des idées dans la section commentaire)
Règles:
- Apportez quelque chose à la table. Ne dites pas simplement "Template Haskell" pour ajouter des installations de métaprogrammation à Haskell. Ce n'est pas StackOverflow.
- L’ensemble de la mise en œuvre doit tenir dans un seul écran (sans compter l’exemple).
- N'hébergez pas de code sur un site externe spécifiquement pour cette tâche.
- La fonctionnalité la plus impressionnante ou surprenante gagne.
Ne vous inquiétez pas pour implémenter la fonctionnalité à 100% correctement. Loin de là! Le principal défi consiste à déterminer ce que vous voulez faire et à supprimer vicieusement les détails jusqu'à ce que votre projet devienne réalisable.
Exemple:
Ajoutez un opérateur lambda au langage de programmation C.
Approche initiale:
Ok, je sais que je voudrais utiliser libgc afin que mes lambdas résolvent les problèmes de funarg ascendants et descendants. Je suppose que la première chose à faire est d’écrire / de trouver un analyseur syntaxique pour le langage de programmation C, puis d’apprendre tout sur le système de types de C. Il faudrait que je trouve un sens à la typographie. Aurais-je besoin d'implémenter l'inférence de type ou devrais-je simplement exiger que le paramètre formel soit typé comme étant donné? Qu'en est-il de toutes ces fonctionnalités folles de CI que vous ne connaissez pas encore?
Il est tout à fait clair que la mise en œuvre correcte de lambda en C serait une entreprise énorme. Oubliez l'exactitude! Simplifier, simplifier.
Mieux:
Amusez-vous! Qui a besoin d'eux? Je pourrais peut - être faire quelque chose délicate avec GNU C fonctions imbriquées et expressions de déclaration . Je voulais montrer une transformation syntaxique étonnante sur C avec un code laconique, mais je n’ai même pas besoin d’un analyseur. Cela peut attendre un autre jour.
Résultat (nécessite 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;
}
C'était facile, n'est-ce pas? J'ai même ajouté une map
macro pour la rendre utile et jolie.