1

我一直在尝试使用 d 语言的参与者模型来实现阶乘函数。我的目标是使用创建actor来单独计算每个部分e产生一个新的actor来制作下一个。我只是D的初学者,所以我只是在学习如何使用该语言。我的目标是将阶乘实施扩展到更多。这只是一个测试。

这是我的问题:我正在尝试使用递归来实现阶乘;事实函数将为行中的下一个数字创建一个新的事实线程,除非它已达到基本条件。

我的代码:

void fact(Tid tid)
{

        int fact = 1;
        receive
        (
        (int i)
        {
            if(i == 0)
            {
                writeln("End of recursion");
            }
            else
            {
                fact *= i;
                send(thisTid, i-1);
            }
        }
    );
    send(tid, fact);
}

void main()
{

        auto tid = spawn(&fact, thisTid);
        int x = 3;
        send(tid, x);
        auto fact = receiveOnly!(int);
        writeln(fact);
}

我什至不知道这是否可能,无论如何它都行不通。如果我尝试添加一个 spwn 实际上函数,它会返回以下错误:

src/main.d(62): Error: template std.concurrency.spawn does not match any function template declaration
/usr/include/x86_64-linux-gnu/dmd/phobos/std/concurrency.d(399): Error: template std.concurrency.spawn(T...) cannot deduce template function from argument types !()(int*,Tid)
src/main.d(63): Error: template std.concurrency.send does not match any function template declaration
/usr/include/x86_64-linux-gnu/dmd/phobos/std/concurrency.d(463): Error: template std.concurrency.send(T...) cannot deduce template function from argument types !()(_error_,int)

那么,有可能做我想做的事吗?如何?如果没有,有没有计划让这样的事情成为可能?

请帮忙。

4

2 回答 2

4

我可能在这里偏离了基础,但从该错误消息来看,在我看来 dmd 没有使用fact您认为它正在使用的spawn. 你有几个名为 的整数fact,虽然在这个例子中(显然减少了,因为它不是 400 行),但它们都不会冲突,但在完整的代码中,我的猜测是其中之一(因为&fact会是int*iffact是 an int)。

尝试将函数重命名为阶乘或类似的,并spawn在适当的地方更改调用。确保不要更改整数。

于 2012-05-22T04:34:37.753 回答
2

对我来说很好。您使用的是什么 DMD 版本?如果您还没有升级到 2.059,也许可以尝试升级。

(注意:我说它的工作原理是编译和运行。它没有给出写答案,因为在它返回之前fact只有receive一个数字,所以它只返回三个。你需要receive在循环中使用)

admin@poita ~% cat test.d
import std.stdio;
import std.concurrency;

void fact(Tid tid)
{
    int fact = 1;
    receive
    (
        (int i)
        {
            if(i == 0)
            {
                writeln("End of recursion");
            }
            else
            {
                fact *= i;
                send(thisTid, i-1);
            }
        }
    );
    send(tid, fact);
}

void main()
{
    auto tid = spawn(&fact, thisTid);
    int x = 3;
    send(tid, x);
    auto fact = receiveOnly!(int);
    writeln(fact);
}

admin@poita ~% dmd test.d
admin@poita ~% ./test
3
admin@poita ~%
于 2012-05-19T11:56:51.340 回答