Go walk树的Erlang翻译

时间:2015-03-10 19:41:01

标签: design-patterns go concurrency erlang

我正在尝试实现here中的Walk函数,该函数在Go into erlang中实现。

结果如下:

-module(tree).
-export([walk/1,test/0]).


walk({Left, Value, Right}) ->
    spawn(tree,walk,[Left]),
    io:format(Value),
    spawn(tree,walk,[Right]);
walk({}) -> continue.



test() ->
B = {{}, alina, {}},
D = {{},vlad,{}},
C = {D, tea, {}},
A = {B,maria,C},
walk(A).

我不确定这是否属于代码审查部分,因为我不确定我所做的是我想要的。代码按预期工作(从某种意义上讲,它确实走了一棵树)但是我不确定函数的设计是否是并发的。

1 个答案:

答案 0 :(得分:1)

该函数确实是并发的,因为您正在生成新的进程来遍历子树。

您可能希望更改tree:walk/1,以便在步行成功的情况下返回原子ok(我还会使用io:format/1切换erlang:display以便值印在不同的行上):

walk({Left, Value, Right}) ->
    spawn(tree,walk,[Left]),
    erlang:display(Value),
    spawn(tree,walk,[Right]),
    ok;
walk({}) -> continue.

这是同一功能的同步版本。我们使用递归代替进程:

walk_sync({Left, Value, Right}) ->
    walk_sync(Left),
    erlang:display(Value),
    walk_sync(Right);
walk_sync({}) -> continue.