Su tarea es agregar una característica a un lenguaje de programación, ya sea implementando una biblioteca muy inteligente o procesando el texto de entrada y / o ajustando el proceso de compilación.
Ideas:
- Agregue intercalación de presentaciones de estilo PHP a C (por ejemplo
<?c printf("Hello,"); ?> world!
). - Agregue un operador de fusión nulo a uno de esos lenguajes que no sea C #.
- Agregar macros a PHP.
- Añadir
goto
a JavaScript. - Agregue la coincidencia de patrones al lenguaje X
- Agregue compatibilidad con espacios de nombres a un idioma que no lo tenga.
- Haz que C parezca PHP.
- Haz que Haskell se parezca a Pascal.
- ... (siéntase libre de publicar ideas en la sección de comentarios)
Reglas:
- Trae algo a la mesa. No solo diga "Template Haskell" para agregar servicios de metaprogramación a Haskell. Esto no es StackOverflow.
- La implementación completa debe caber en una pantalla completa (sin contar el ejemplo).
- No aloje código en un sitio externo específicamente para esta tarea.
- La característica más impresionante o sorprendente gana.
No se preocupe por implementar la función 100% correctamente. ¡Lejos de ahi! El principal desafío es descubrir lo que quiere hacer y cortar brutalmente los detalles hasta que su empresa planificada sea factible.
Ejemplo:
Agregue un operador lambda al lenguaje de programación C.
Acercamiento inicial:
Bien, sé que me gustaría usar libgc para que mis lambdas resuelvan los problemas de funarg hacia arriba y hacia abajo. Supongo que lo primero que tendría que hacer es escribir / encontrar un analizador para el lenguaje de programación C, luego necesitaría aprender todo sobre el sistema de tipos de C. Tendría que descubrir cómo darle sentido en lo que respecta a los tipos. ¿Tendría que implementar la inferencia de tipos, o simplemente debería requerir que el parámetro formal se escriba como se indica? ¿Qué pasa con todas esas características locas en CI que aún no conocemos?
Está bastante claro que implementar lambda en C correctamente sería una tarea enorme. ¡Olvídate de la corrección! Simplifica, simplifica.
Mejor:
Atornille funargs hacia arriba, ¿quién los necesita? Podría hacer algo complicado con las funciones anidadas de GNU C y las expresiones de declaración . Quería mostrar una sorprendente transformación sintáctica en C con un código escueto y hacky, pero ni siquiera necesitaré un analizador para esto. Eso puede esperar para otro día.
Resultado (requiere 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;
}
Eso fue fácil, ¿no? Incluso agregué una map
macro para que sea útil y bonita.