【发布时间】:2010-05-02 00:23:39
【问题描述】:
如果是这样,你如何使用它? (语法)
另外,为什么 C 支持或为什么不支持 lambda 表达式?
【问题讨论】:
如果是这样,你如何使用它? (语法)
另外,为什么 C 支持或为什么不支持 lambda 表达式?
【问题讨论】:
不,C 不支持 lambda 表达式。
如果您愿意使用 C++,Boost 有一个模拟 lambda 的库。此外,C++0x 将内置对 lambda 表达式的支持。
当时 C 语言对 lambda 表达式支持的需求并不大,因此该语言不支持它。
【讨论】:
C 不支持 lambda 表达式,也不支持任何其他方式(在语言标准内)动态创建函数——根据标准,所有函数都是在编译时创建的。我猜原因是为了保持语言小巧、简单、精简且非常快速,几乎不需要任何“运行时库”支持——这对于广泛用于编程操作系统、设备驱动程序、嵌入式应用程序和以此类推。
【讨论】:
x => x*x 这样的函数并评估指向该函数的指针,所有这些都不会破坏您提到的约束。只有当您希望您的 lambda 访问其周围范围时,使用仅包含代码地址的典型 C 函数指针才变得不可能。这种无上下文的函数是否应该被正确地称为“lambdas”,我不知道。
不,C 没有 lambda 表达式(或任何其他创建闭包的方式)。
这很可能是因为 C 是一种低级语言,它避免了性能不佳和/或使语言或运行时系统更复杂的功能。
【讨论】:
我今天看到了这个:https://github.com/wd5gnr/clambda/blob/master/clambda2.c
请看上面链接的代码:
#include <stdio.h>
float thelist[]={ 3.141, 6.02, 42.0, 0.7 };
#define lambda(lambda$_ret, lambda$_args, lambda$_body)\
({\
lambda$_ret lambda$__anon$ lambda$_args\
lambda$_body\
&lambda$__anon$;\
})
float average_apply(float (*fn)(float inp))
{
int i,n=sizeof(thelist)/sizeof(thelist[0]);
float avg=0.0;
for (i=0;i<n;i++)
{
avg+=fn(thelist[i]);
printf("Running sum=%f\n", avg);
}
return avg/n;
}
int main(int argc, char *argv[])
{
printf("%f\n",average_apply(lambda(float,(float x),{ return 2*x; })));
printf("%f\n",average_apply(lambda(float,(float x),{ return x/3.0; })));
return 0;
}
并且在 gcc 中工作正常。
【讨论】: