我一直在玩D,试图通过链接lambda表达来模仿Scala style curryable functions。
我想出了这个:
immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
struct S
{
static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
}
class C static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
}
void main()
{
writefln("global\t%s",foo(1)(2));
writefln("struct\t%s",S.foo(1)(2));
writefln("class\t%s",C.foo(1)(2));
}
这是我运行时得到的结果:
global 3
struct 1528543170
Segmentation fault
正如您所看到的,我的方法适用于全局函数变量,但struct的静态函数变量会产生垃圾结果,而类的静态函数变量完全失败。
如果我从返回表达式中删除x
- function(immutable int x)=>(immutable int y)=>(y)
- 结构版本提供了正确的结果(2
),但类版本仍然失败。
如果我使用常规方法,而不是函数变量:
immutable foo=function(immutable int x)=>(immutable int y)=>(x+y);
struct S
{
static auto foo(immutable int x)
{
return (immutable int y)=>(x+y);
}
}
class C
{
static auto foo(immutable int x)
{
return (immutable int y)=>(x+y);
}
}
void main()
{
writefln("global\t%s",foo(1)(2));
writefln("struct\t%s",S.foo(1)(2));
writefln("class\t%s",C.foo(1)(2));
}
它运作得很好:
global 3
struct 3
class 3
我也获得了使用委托的优势(编译器不允许在第一个版本中使用委托) - 但这种风格不太优雅。
我很清楚D在curry
库中有std.functional
函数用于调整函数,但有时候在默认情况下使函数可以调整更方便,而且旁边 - 我很好奇知道为什么我的第一个版本不起作用。
有什么想法吗?
更新
好的,I've filed a bug。我已经做了一些挖掘,结果发现foo
的参数列表被移位了,这就是x
获取垃圾数据的原因。
答案 0 :(得分:4)
老实说,看起来你遇到了编译错误。 Please report it。由于struct和class中的变量是静态的,因此它们的行为应该与模块级变量的行为相同,显然,它不是。