C里实现Lambda……

15 views
Skip to first unread message

Googol Lee

unread,
Dec 13, 2007, 11:18:30 AM12/13/07
to pon...@googlegroups.com
reddit上最近发出来的一个方法,我只能说……太不靠谱了……

不过,有没有让这个Lambda的编译一部分在编译期完成呢?运行时传参数进去就可以。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int(returns_int_f)();

static returns_int_f* returns_int_lambda(char *source) {
FILE *fp = popen("gcc -Wall -Werror -c -x c - -o ./wee", "w");
const int magic_offset = 0x34;
fwrite(source, 1, strlen(source), fp);
fprintf(fp, "\n");
fclose(fp);
fp = fopen("wee", "r");
long binlength;
fseek(fp, 0, SEEK_END);
binlength = ftell(fp) - magic_offset;
fseek(fp, magic_offset, SEEK_SET);
char *binbuf = malloc(binlength);
fread(binbuf, 1, binlength, fp);
fclose(fp);
return (returns_int_f *) binbuf;
}

int main() {
returns_int_f *times2 = returns_int_lambda("int f(x) { return x * 2; }");
int answer = (*times2)(55);
printf("answer is %d\n", answer);
}

--
新的理论从少数人的主张到一统天下,并不是因为这个理论说服了别人抛弃旧观点,而是因为一代人的逝去。

My blog: http://googollee.blog.163.com

Yong Yuan

unread,
Dec 13, 2007, 11:42:27 AM12/13/07
to pon...@googlegroups.com
果然邪恶。

hayate

unread,
Dec 13, 2007, 2:00:40 PM12/13/07
to pon...@googlegroups.com
有创意啊

shark

unread,
Dec 13, 2007, 7:44:41 AM12/13/07
to pon...@googlegroups.com
这个Tiny CC不是早就能做了么?而且还是直接快速地在内存里生成代码。

katkat lim

unread,
Dec 13, 2007, 7:36:17 PM12/13/07
to pon...@googlegroups.com
我当年也是这样想的。。。

Googol Lee

unread,
Dec 13, 2007, 9:37:51 PM12/13/07
to pon...@googlegroups.com
Tiny CC是在执行文件里包了个解释C语法的解释器吧?不过用的不广泛。

在 07-12-13,shark<cplus...@gmail.com> 写道:

shark

unread,
Dec 13, 2007, 4:52:04 PM12/13/07
to pon...@googlegroups.com
是编译器,直接在内存里生成二进制代码了。

pongba

unread,
Dec 14, 2007, 2:12:02 AM12/14/07
to pon...@googlegroups.com
刚才打开reddit刚看到,居然被你抢先了,啊哈:-)
很强大,不过还是那句话,何必呢,何苦呢~~

寒光

unread,
Dec 14, 2007, 7:26:10 AM12/14/07
to TopLanguage
你太有才了!

On 12月14日, 上午12时18分, "Googol Lee" <googol...@gmail.com> wrote:
> reddit上最近发出来的一个方法,我只能说......太不靠谱了......

up duan

unread,
Dec 17, 2007, 3:13:35 AM12/17/07
to pon...@googlegroups.com
其实很有必要。又增加了一个层次或者维度,让aspect之类的技术也可以在C中长大了。:)

设想当年Java出现的各种各样的class manipulator库和Java6引入的Compiler
API就知道:有时候增加一个自足的层次环极大的简化了抽象的进行。

Reply all
Reply to author
Forward
0 new messages