锁定老帖子 主题:lambda之路...
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-11-10
可不可以再改进一下,允许省略参数类型和返回值类型,做到:
"x -> x*x" |
|
返回顶楼 | |
发表时间:2007-11-10
引用 qiezi 对了,你上面这种消除mixin的手法也只有在最新的DMD上才能进行吧,这是一个闭包而不是内嵌函数或委托量。 另外改用你这个版本以后,前两个用法都能通过,第三个有点问题: 代码 1. string sep = ";\n"; 2. string[] arr2 = arr.map(lambda!("string | int x -> toString(x) ~ sep")); 3. writefln(arr2); 编译无法通过,因为返回的闭包被包裹了一层,上下文已经不对了。 我的办法在 D 1.0 上也是可行的(GDC 0.24测试),附带的好处是可以防止1.0 的闭包问题,当然,定义处上下文是不能处理了。 D的delegate字面值允许省略返回值类型,所以 _RetType 也可以省掉了。 |
|
返回顶楼 | |
发表时间:2007-11-10
oldrev 写道 可不可以再改进一下,允许省略参数类型和返回值类型,做到:
"x -> x*x" 这个好像是类型反推了,估计有点困难。如何从这个委托所处的上下文获得它应该成为的类型? |
|
返回顶楼 | |
发表时间:2007-11-10
oldrev 写道 引用 qiezi 对了,你上面这种消除mixin的手法也只有在最新的DMD上才能进行吧,这是一个闭包而不是内嵌函数或委托量。 另外改用你这个版本以后,前两个用法都能通过,第三个有点问题: 代码 1. string sep = ";\n"; 2. string[] arr2 = arr.map(lambda!("string | int x -> toString(x) ~ sep")); 3. writefln(arr2); 编译无法通过,因为返回的闭包被包裹了一层,上下文已经不对了。 我的办法在 D 1.0 上也是可行的(GDC 0.24测试),附带的好处是可以防止1.0 的闭包问题,当然,定义处上下文是不能处理了。 D的delegate字面值允许省略返回值类型,所以 _RetType 也可以省掉了。 从函数里面返回delegate在D1。0上应该也是不安全的吧。 |
|
返回顶楼 | |
发表时间:2007-11-10
引用 这个好像是类型反推了,估计有点困难。 仔细想了一下,确实是不行,不过返回值类型确实是可以省略的。 引用 从函数里面返回delegate在D1。0上应该也是不安全的吧。 因为这个 delegate 无法触及任何作用域以外的东西,就跟递归调用一样。 |
|
返回顶楼 | |
发表时间:2007-11-10
oldrev 写道 引用 这个好像是类型反推了,估计有点困难。 仔细想了一下,确实是不行,不过返回值类型确实是可以省略的。 返回值是可以省略,现在也支持,不过在D这种强类型系统里面,有时候需要明确指定返回类型来进行精确匹配,减少程序员犯错误的机会,比如: char c = 'a'; auto i = c & 0xff; writefln(typeid(typeof(i))); 新手很容易认为i是个char类型,实际上却是个int,所以可选的返回值类型我感觉是必要的。 |
|
返回顶楼 | |