d idioma simultaneidade com a recursão
-
11-12-2019 - |
Pergunta
Estou tentando implementar uma função fatorial usando o modelo de agente com a língua.Meu objetivo é usar para criar ator para calcular cada parte sozinho e gerar um novo ator para fazer o próximo.Eu sou apenas um iniciante com D, então eu estou apenas aprendendo a usar a linguagem.Meu objetivo é expandir o factorial de implementação muito mais.Este é apenas um teste.
Aqui está o meu problema:Eu estou tentando implementar o fatorial utilizando a recursividade;o fato de que a função de criar um fato novo thread para o próximo número de uma linha, a menos que ele tenha alcançado a condição de base.
O meu código:
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);
}
Eu nem sei se isso é possível, em qualquer caso, ele não funciona.Se eu tentar adicionar um spwn na verdade, a função retorna o seguinte erro:
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)
Assim, é possível fazer o que eu estou tentando fazer?Como?Se não, existe algum plano para fazer alguma coisa assim que possível?
Por favor, ajuda.
Solução
Eu poderia ser a forma fora da base aqui, mas a partir dessa mensagem de erro ele olha para mim como dmd não está usando o fact
o que você acha que ele está usando, em sua chamada para spawn
.Você tem vários números inteiros chamado fact
, e apesar de isso (obviamente cortada, pois não é de 400 linhas) exemplo nenhum deles entraria em conflito, o código completo o meu palpite é que um deles faz (porque &fact
seria um int*
se fact
foi um int
).
Tente renomear a função fatorial ou algo assim, e mudando o spawn
chamada onde apropriado.Certifique-se de não alterar os números inteiros.
Outras dicas
Funciona bem para mim.O que DMD versão você está usando?Talvez tente atualizar para 2.059 se você já não estiver nele.
(Nota:Eu digo que funciona no que compila e executa.Ele não dá a resposta, porque escrever fact
só receive
um número antes de retornar, então ele retorna apenas três.Você precisa ter o receive
em um loop)
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 ~%