Sua tarefa é aplicar um recurso a uma linguagem de programação, implementando uma biblioteca muito inteligente ou processando o texto de entrada e / ou aprimorando o processo de compilação.
Idéias:
- Adicione apresentação em estilo PHP intercalada em C (por exemplo
<?c printf("Hello,"); ?> world!
). - Adicione um operador coalescente nulo a um desses idiomas que não é C #.
- Adicione macros ao PHP.
- Adicionar
goto
ao JavaScript. - Adicione um padrão correspondente ao idioma X.
- Adicione suporte ao namespace a um idioma que não o possui.
- Faça C parecer PHP.
- Faça Haskell parecer Pascal.
- ... (fique à vontade para postar ideias na seção de comentários)
Regras:
- Traga algo para a mesa. Não basta dizer "Template Haskell" para adicionar recursos de metaprogramação ao Haskell. Isso não é StackOverflow.
- Toda a implementação deve caber em uma tela (sem contar o exemplo).
- Não hospede o código em um site externo especificamente para esta tarefa.
- O recurso mais impressionante ou surpreendente vence.
Não se preocupe em implementar o recurso 100% corretamente. Longe disso! O principal desafio é descobrir o que você deseja fazer e cortar com crueldade os detalhes até que sua tarefa planejada se torne viável.
Exemplo:
Adicione um operador lambda à linguagem de programação C.
Abordagem inicial:
Ok, eu sei que gostaria de usar a libgc para que minhas lambdas resolvam os problemas de funarg para cima e para baixo. Eu acho que a primeira coisa que eu preciso fazer é escrever / encontrar um analisador para a linguagem de programação C, então eu precisaria aprender tudo sobre o sistema de tipos de C. Eu teria que descobrir como fazer sentido disso, tanto quanto os tipos. Eu precisaria implementar a inferência de tipo ou simplesmente exigiria que o parâmetro formal fosse digitado conforme fornecido? E todos esses recursos malucos no CI ainda não sabem?
Está bem claro que implementar corretamente o lambda em C seria uma tarefa enorme. Esqueça a correção! Simplifique, simplifique.
Melhor:
Dane-se funargs para cima, quem precisa deles? Eu poderia ser capaz de fazer algo complicado com o GNU C funções aninhadas e expressões declaração . Eu queria mostrar uma incrível transformação sintática em C com código hacker conciso, mas nem precisarei de um analisador para isso. Isso pode esperar por outro dia.
Resultado (requer 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;
}
Isso foi fácil, não foi? Até joguei uma map
macro para torná-la útil e bonita.