我一直在尝试使用d语言的actor模型实现一个阶乘函数。 我的目标是使用创建actor来单独计算每个部分,然后生成一个新的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)
那么,有可能做我想做的事吗?怎么样? 如果没有,有没有计划做出这样的事情呢?
请帮助。
答案 0 :(得分:4)
我可能会离开这里,但是从那个错误消息中我看起来dmd没有使用您认为它正在使用的fact
,而是在spawn
的调用中。你有几个名为fact
的整数,虽然在这里(显然是减少了,因为它不是400行)例子中没有一个会发生冲突,在完整代码中我的猜测就是其中之一(因为{{1}如果&fact
是int*
),则为fact
。
尝试将函数重命名为factorial或某些此类函数,并在适当的位置更改int
调用。确保不要更改整数。
答案 1 :(得分:2)
对我来说很好。您使用的DMD版本是什么?如果您尚未升级到2.059,也许可以尝试升级到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 ~%