论坛首页 编程语言技术论坛

lambda之路...

浏览 8705 次
锁定老帖子 主题:lambda之路...
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-10  
可不可以再改进一下,允许省略参数类型和返回值类型,做到:
"x -> x*x"
0 请登录后投票
   发表时间: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 也可以省掉了。
0 请登录后投票
   发表时间:2007-11-10  
oldrev 写道
可不可以再改进一下,允许省略参数类型和返回值类型,做到:
"x -> x*x"

这个好像是类型反推了,估计有点困难。如何从这个委托所处的上下文获得它应该成为的类型?
0 请登录后投票
   发表时间: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上应该也是不安全的吧。
0 请登录后投票
   发表时间:2007-11-10  
引用

这个好像是类型反推了,估计有点困难。

仔细想了一下,确实是不行,不过返回值类型确实是可以省略的。
引用

从函数里面返回delegate在D1。0上应该也是不安全的吧。

因为这个 delegate 无法触及任何作用域以外的东西,就跟递归调用一样。
0 请登录后投票
   发表时间:2007-11-10  
oldrev 写道
引用

这个好像是类型反推了,估计有点困难。

仔细想了一下,确实是不行,不过返回值类型确实是可以省略的。

返回值是可以省略,现在也支持,不过在D这种强类型系统里面,有时候需要明确指定返回类型来进行精确匹配,减少程序员犯错误的机会,比如:
	char c = 'a';
	auto i = c & 0xff;
	writefln(typeid(typeof(i)));

新手很容易认为i是个char类型,实际上却是个int,所以可选的返回值类型我感觉是必要的。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics