您的任务是通过实现一个非常聪明的库,或者通过处理输入文本和/或调整编译过程,将特征附加到编程语言上。
想法:
- 将PHP样式的演示文稿添加到C中(例如
<?c printf("Hello,"); ?> world!
)。 - 添加一个空合并运算符到非C#的一种语言中。
- 将宏添加到PHP。
- 加
goto
到JavaScript。 - 将模式匹配添加到语言X。
- 将名称空间支持添加到没有语言支持的语言中。
- 使C看起来像PHP。
- 使Haskell看起来像Pascal。
- ...(可在评论部分中发表想法)
规则:
- 把东西拿到桌上。不要只说“ Template Haskell”即可向Haskell添加元编程功能。这不是StackOverflow。
- 整个实现应该适合一个屏幕(不包括示例)。
- 不要将代码托管在专门用于此任务的外部站点上。
- 最令人印象深刻或令人惊讶的功能获胜。
不必担心100%正确地实现该功能。离得很远!主要的挑战是弄清楚您想做什么,并恶毒地砍掉细节,直到计划好的工作变得可行。
例:
向C编程语言添加一个lambda运算符。
初始方法:
好的,我知道我想使用libgc,以便我的lambda可以解决向上和向下的funarg问题。我想我需要做的第一件事是为C编程语言编写/查找一个解析器,然后我需要学习有关C的类型系统的所有知识。就类型而言,我必须弄清楚如何理解它。我需要实现类型推断,还是只需要按照给定的形式键入形式参数?CI中所有不知道的疯狂功能怎么办?
很明显,在C中正确实现lambda是一项艰巨的任务。忘记正确性!简化,简化。
更好:
向上拧螺丝,谁需要它们?使用GNU C的嵌套函数和语句表达式,我也许可以做一些棘手的事情。我想用简洁的hacky代码展示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
宏使它变得有用和漂亮。