Ваше завдання - приєднати функцію до мови програмування, або шляхом впровадження дуже розумної бібліотеки, або шляхом обробки тексту введення та / або налаштування процесу компіляції.
Ідеї:
- Додайте переплетення презентацій у стилі PHP до C (наприклад
<?c printf("Hello,"); ?> world!
). - Додайте нульовий оператор згортання до однієї з тих мов, яка не є C #.
- Додайте макроси до PHP.
- Додати
goto
в JavaScript. - Додати відповідність шаблону мові X.
- Додайте підтримку простору імен до мови, яка її не має.
- Зробіть C схожим на PHP.
- Зробіть Хаскелл схожим на Паскаля.
- ... (сміливо публікуйте ідеї в розділі коментарів)
Правила:
- Принесіть щось до столу. Не просто скажіть "Шаблон Haskell", щоб додати засоби метапрограмування до Haskell. Це не StackOverflow.
- Вся реалізація повинна вміщуватися в одному екрані (не рахуючи приклад).
- Не розміщуйте код хостингу на зовнішньому сайті спеціально для цього завдання.
- Виграє найбільш вражаюча чи дивовижна функція.
Не хвилюйтесь щодо правильної реалізації функції на 100%. Далеко від цього! Основним завданням є з'ясування того, що ви хочете зробити, і порочне відрізання деталей, поки ваше планове завдання не стане можливим.
Приклад:
Додайте лямбда-оператора до мови програмування C.
Початковий підхід:
Гаразд, я знаю, що хотів би скористатися libgc, щоб мої лямбда вирішили проблеми вгору та вниз по фунаргу. Я думаю, що перше, що мені потрібно зробити, - це написати / знайти аналізатор для мови програмування на C, тоді мені потрібно буде дізнатися все про систему типу C. Я повинен був би розібратися, як це зрозуміти, наскільки це стосується типів. Чи потрібно мені реалізувати умовиводи типу, або мені просто потрібно вимагати введення формального параметра, як задано? Що про всі ці божевільні риси в CI ще не знають?
Цілком зрозуміло, що правильно реалізувати лямбда в C було б величезним завданням. Забудьте про правильність! Спростити, спростити.
Краще:
Закрутіть вгору фунаргів, кому їх потрібно? Я міг би бути в змозі зробити що - то хитре з GNU Кассіопеяна вкладених функцій і заяву вираження . Я хотів продемонструвати дивовижну синтаксичну трансформацію на C із терзистим, хакі-кодом, але мені навіть для цього не потрібен аналізатор. Це може зачекати ще один день.
Результат (потрібен 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;
}
Це було легко, чи не так? Я навіть кинув map
макрос, щоб зробити його корисним і гарним.