我一直在玩 D,试图通过链接 lambda 表达式来模仿Scala 风格的可咖喱函数。
我想出了这个:
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
如您所见,我的方法适用于全局函数变量,但结构的静态函数变量给出垃圾结果,并且类的静态函数变量完全失败。如果我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
而且我还获得了使用委托的优势(编译器在第一个版本中不允许委托) - 但这种风格不太优雅。
我很清楚 Dcurry
在std.functional
库中有用于 currying 函数的函数,但有时默认情况下使函数可curryable 更舒服,此外 - 我很想知道为什么我的第一个版本不起作用。
有任何想法吗?
更新
好的,我已经提交了一个错误。我做了更多的挖掘,结果证明参数列表foo
被转移了,这就是为什么x
会得到垃圾数据。