6

我一直在玩 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

而且我还获得了使用委托的优势(编译器在第一个版本中不允许委托) - 但这种风格不太优雅。

我很清楚 Dcurrystd.functional库中有用于 currying 函数的函数,但有时默认情况下使函数可curryable 更舒服,此外 - 我很想知道为什么我的第一个版本不起作用。

有任何想法吗?

更新

好的,我已经提交了一个错误。我做了更多的挖掘,结果证明参数列表foo被转移了,这就是为什么x会得到垃圾数据。

4

1 回答 1

4

老实说,看起来您遇到了编译器错误。请报告。由于结构和类中的变量是静态的,它们的行为应该与模块级变量的行为相同,显然不是。

于 2012-06-11T18:24:04.993 回答