[新闻] Lambda函数&闭包将成为C++标准新特性
hurd
2008-04-15
如果说函数式程序设计语言的复兴还未成为主流的话,那么函数式程序设计的重要特征Lambda函数与闭包已经真正成为主流了。
据图灵出版的《Exceptional C++ Style中文版》作者Herb Sutter的报道,C++标准委员会已经投票通过,将Lambda函数与闭包加入C++0x。同时批准的新特性有: * N2535 Namespace associations (inline namespace) * N2540 Inheriting constructors * N2541 New function declarator syntax * N2543 STL singly linked lists (forward_list) * N2544 Unrestricted unions * N2546 Removal of auto as a storage-class specifier * N2551 Variadic template versions of std::min, std::max, and std::minmax * N2554 Scoped allocator model * N2525 Allocator-specific swap and move behavior * N2547 Allow lock-free atomic in signal handlers * N2555 Extended variadic template template parameters * N2559 Nesting exceptions (aka wrapped exceptions) 加上已经率先拥抱Lambda的C#和其他许多CLR语言(比如VB2008),以及Java 7,还有本就出身“正派”的一堆动态语言……函数式编程的春天已经来了。 当然,对于语言不断增加特性的这种赶集扎堆现象,批评之声也一直不绝于耳。图灵出版的《修改代码的艺术》一书作者Michael Feathers就发出疑问了:“Will Java 7 Be Beautiful?” 一种新的特性,有其利,也必然有其弊。而且各种语言本来就各有擅长,何必勉强地改得越来越像?从另一角度来说,混合使用多语言,在虚拟机一层为多语言的集成更多地努力,也许是更正确的做法? 转自 http://blog.csdn.net/turingbook/archive/2008/03/30/2231691.aspx |
|
oldrev
2008-04-15
D新闻组里报道的时候就看过了,C++ 的新'入'语法真丑
|
|
qiezi
2008-04-16
Lambda/Closure和多核没什么关系吧,它只是方便FP,还有就是很容易根据当前上下文构造处理逻辑。
我觉得语言里加任何东西都没什么关系,这些你可以不用,只要不影响旧的用法。 |
|
ychael
2008-04-16
引用 在OO类语言中加入 Lambda函数/闭包简直变成了四不像。 RUBY的block就是闭包closuer可以构造continuation
|
|
qiezi
2008-04-16
自言200801 写道 而Lambda/Closure实际上就是一个函数(不管是一阶还是高阶), 它仅仅相当于一个对象中提供的某一个公用方法,它没有字段, 你可以认为它是没有状态的,有多个线程要来执行这个函数,仅仅是执行这个函数中的指令代码而已,执行完了就得到一个结果,多个线程之间不需要同步或互斥来保证任何的数据是否一致,这样就省掉了与对象锁有关的任何开销。 这个是基于一些纯函数式语言的结论吧,在OO里面应该没办法禁止在Lambda/Closure里面多个线程修改同一对象。。 自言200801 写道 在Java,C++中加入Lambda/Closure只会让写出的代码越来越缺乏美感。 C++里面少点美感也无所谓了,能少写点代码还是很值。 |
|
RednaxelaFX
2008-04-18
自言200801 写道 在Java的Closure草案中
http://www.javac.info/closures-v05.html 有这样一段话: it is a compile-time error if the function being converted refers to a non-final local variable declared in an enclosing scope. 貌似在编译期间就不准在Lambda/Closure里涉及non-final变量, 换句话说只能是final变量,也就是不可变的。 这跟我上面提的“不可变对象”其实思路都差不多。 那句话是有上下文的: 引用 If the target of the closure conversion extends the marker interface java.lang.RestrictedFunction then
没有继承RestrictedFunction这个标记接口的不受影响。 |