Twoim zadaniem jest zaadaptowanie funkcji do języka programowania, albo przez wdrożenie bardzo sprytnej biblioteki, albo przez przetworzenie tekstu wejściowego i / lub dostosowanie procesu kompilacji.
Pomysły:
- Dodaj przeplatanie prezentacji w stylu PHP do C (np
<?c printf("Hello,"); ?> world!
.). - Dodaj zerowy operator koalescencyjny do jednego z tych języków, który nie jest C #.
- Dodaj makra do PHP.
- Dodaj
goto
do JavaScript. - Dodaj dopasowanie wzorca do języka X.
- Dodaj obsługę przestrzeni nazw do języka, który jej nie ma.
- Spraw, aby C wyglądał jak PHP.
- Spraw, by Haskell wyglądał jak Pascal.
- ... (zachęcamy do publikowania pomysłów w sekcji komentarzy)
Zasady:
- Przynieś coś do stołu. Nie mów tylko „Szablon Haskell”, aby dodać funkcje metaprogramowania do Haskell. To nie jest StackOverflow.
- Cała implementacja powinna zmieścić się na jednym ekranie (nie licząc przykładu).
- Nie hostuj kodu w witrynie zewnętrznej specjalnie do tego zadania.
- Najbardziej imponująca lub zaskakująca funkcja wygrywa.
Nie martw się o prawidłowe wdrożenie tej funkcji w 100%. Daleko stąd! Głównym wyzwaniem jest ustalenie, co chcesz zrobić, i brutalne wycięcie szczegółów, dopóki planowane przedsięwzięcie nie stanie się wykonalne.
Przykład:
Dodaj operator lambda do języka programowania C.
Wstępne podejście:
Okej, wiem, że chciałbym użyć libgc, aby moje lambdas rozwiązały problemy ze wzrostem i spadkiem. Myślę, że pierwszą rzeczą, którą muszę zrobić, to napisać / znaleźć parser dla języka programowania C, a następnie musiałbym dowiedzieć się wszystkiego o systemie typów C. Musiałbym dowiedzieć się, jak to zrozumieć, jeśli chodzi o typy. Czy musiałbym wdrożyć wnioskowanie o typie, czy powinienem po prostu wymagać, aby parametr formalny był wpisany tak, jak podano? Co z tymi wszystkimi szalonymi funkcjami w CI, o których jeszcze nie wiem?
Jest całkiem jasne, że poprawne wdrożenie lambda w C byłoby dużym przedsięwzięciem. Zapomnij o poprawności! Uprość, uprość.
Lepszy:
Pieprzyć się w górę, kto ich potrzebuje? Mogę być w stanie coś zrobić trudne z GNU C na zagnieżdżone funkcje i wyrażenia rachunku . Chciałem pochwalić się niesamowitą syntaktyczną transformacją na C za pomocą zwięzłego, zhackowanego kodu, ale nie potrzebuję nawet parsera do tego. To może poczekać na kolejny dzień.
Wynik (wymaga 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;
}
To było łatwe, prawda? Wrzuciłem nawet map
makro, aby było użyteczne i ładne.