在D中检测纯函数的非变异调用语句

时间:2013-03-02 11:28:53

标签: d function-call dmd in-place

我相信D有可能为其编译器套件添加另一个很酷的功能,即禁止对纯函数进行非副作用调用的能力。

例如

auto s = "a";
toStringz(a);

应该是错误的

a == "";

目前DMD中的错误为

Error: == has no effect in expression (s == "")

这样的功能会阻止程序员意外调用非静音算法时,他希望它具有就地(变异)语义。这不需要使用GCC __attribute((warn_unused_result))__attribute((const))等属性明确标记函数。

DMD的待办事项列表上有这样的功能吗?

2 个答案:

答案 0 :(得分:3)

DMD没有正式的TODO列表。它的开发主要基于志愿者的工作,虽然一些增强请求在bugzilla中得到“预先批准”的标签,但是当这个功能可以实现时它没有说明任何关于术语的信息,或者它将被实现。

鉴于现在有很多更严重的问题需要解决,我几乎无法期待近年来实施的那些小问题。

此外,您的问题实际上看起来像提案,更适合官方DMD / Phobos bugzilla:http://d.puremagic.com/issues/

答案 1 :(得分:0)

问题在于D大量使用模板。您无法始终控制模板或其参数。例如:

class Foo{
    /*...*/
    pure int foo(){
        /*...*/
    }
    /*...*/
}

void bar(T)(T arg){
    /*...*/
    arg.foo();
    /*...*/
}

现在您无法使用bar参数调用Foo。这可以通过删除foo的纯度(可能会破坏代码和/或损害性能)或将bar更改为将foo()的结果存储在变量中来修复(黑客攻击) (这也很糟糕,因为它永远不会使用该值,因为foo的返回类型可能无效甚至更糟 - 带有析构函数的struct(它的调用将被推迟到结尾bar执行。)当然 - 只有你可以改变Foobar ......