【问题标题】:Erlang translation of Go walk treesGo walk trees 的 Erlang 翻译
【发布时间】:2015-05-12 10:04:00
【问题描述】:

我正在尝试从here 中实现Walk 函数,该函数在Go 中实现到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).

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

【问题讨论】:

    标签: design-patterns go concurrency erlang


    【解决方案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.
    

    【讨论】:

    • fwiw 您可以使用“波浪符转义”format codes 插入换行符,这类似于经典的 C printf 样式,但使用“~”而不是“\”作为前缀。所以,io:format("~n") 输出一个换行符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多