Il tuo compito è quello di applicare una funzionalità a un linguaggio di programmazione, implementando una libreria molto intelligente, oppure elaborando il testo di input e / o modificando il processo di compilazione.
idee:
- Aggiungi la presentazione in stile PHP interlacciata a C (ad es
<?c printf("Hello,"); ?> world!
.). - Aggiungi un operatore null a coalescenza in una di quelle lingue che non è C #.
- Aggiungi macro a PHP.
- Aggiungi
goto
a JavaScript - Aggiungi la corrispondenza del modello alla lingua X.
- Aggiungi il supporto dello spazio dei nomi a una lingua che non lo possiede.
- Rendi C simile a PHP.
- Fai sembrare Haskell come Pascal.
- ... (sentiti libero di pubblicare idee nella sezione commenti)
Regole:
- Porta qualcosa sul tavolo. Non basta dire "Template Haskell" per aggiungere strutture di metaprogrammazione a Haskell. Questo non è StackOverflow.
- L'intera implementazione dovrebbe rientrare in una schermata (senza contare l'esempio).
- Non ospitare codice su un sito esterno appositamente per questa attività.
- Vince la caratteristica più impressionante o sorprendente.
Non preoccuparti di implementare correttamente la funzione al 100%. Lontano da esso! La sfida principale è capire cosa vuoi fare e tagliare ferocemente i dettagli fino a quando la tua impresa pianificata diventa fattibile.
Esempio:
Aggiungi un operatore lambda al linguaggio di programmazione C.
Approccio iniziale:
Ok, lo so che vorrei usare libgc così i miei lambda risolveranno i problemi di funarg verso l'alto e verso il basso. Immagino che la prima cosa che dovrei fare sia scrivere / trovare un parser per il linguaggio di programmazione C, quindi dovrei imparare tutto sul sistema di tipi C. Dovrei capire come darne un senso per quanto riguarda i tipi. Dovrei implementare l'inferenza del tipo o dovrei semplicemente richiedere che il parametro formale sia digitato come indicato? Che dire di tutte quelle folli funzionalità di CI che non conoscono ancora?
È abbastanza chiaro che implementare correttamente lambda in C sarebbe un'impresa enorme. Dimentica la correttezza! Semplifica, semplifica.
Meglio:
Fanculo verso l'alto, chi ne ha bisogno? Potrei essere in grado di fare qualcosa di complicato con GNU C funzioni nidificate e le espressioni dichiarazione . Volevo mostrare un'incredibile trasformazione sintattica su C con codice conciso, hacky, ma non mi servirà nemmeno un parser per questo. Che può aspettare un altro giorno.
Risultato (richiede 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;
}
È stato facile, no? Ho anche lanciato una map
macro per renderla utile e carina.