代码之家  ›  专栏  ›  技术社区  ›  Vanya

Erlang中内部函数的递归

  •  3
  • Vanya  · 技术社区  · 14 年前

    玩Erlang时,我有一个进程循环函数,如:

    process_loop(...A long list of parameters here...) ->
        receive
            ...Message processing logic involving the function parameters...
        end,
        process_loop(...Same long list of parameters...)
    end.
    

    它看起来很难看,所以我尝试了这样的重构:

    process_loop(...A long list of parameters...) ->
        Loop = fun() ->
            receive
                ...Message processing logic...
            end,
            Loop()
        end,
        Loop()
    end.
    

    process_loop(...A long list of parameters...) ->
        Loop = fun(Next) ->
            receive
                ...Message processing logic...
            end,
            Next(Next)
        end,
        Loop(Loop)
    end.
    

    我有两个问题:

    1. 有没有一种方法可以实现snippet#2的想法,但是没有这种“Next(Next)”解决方法?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Daniel Luna    14 年前
    1. 代码片段#3有点贵。既然你在身体里的信息上做了模式匹配,我就不用担心了。在这种情况下,优化可读性。差异是一个非常小的常数因子。

        2
  •  2
  •   Papipo    14 年前
    1. 您可以使用元组/记录作为命名参数,而不是传递大量参数。您可以重用函数将要采用的单个参数。

        3
  •  0
  •   RichardC    14 年前

    避免重复代码片段#1中参数列表的更常规的方法是将所有或大部分参数放在保存循环状态的记录中。那么在循环中只有一个或几个变量可以传递。这比玩递归函数更容易阅读,也更难搞砸。

        4
  •  0
  •   rvirding    14 年前

    我必须说,在所有情况下,我做这种类型的递归,我认为我从来没有遇到过的情况下,确切的 变量集在递归中传递。通常,变量的变化反映了过程循环中的状态变化。否则就不可能了,因为您必须显式地处理状态。我通常将相关参数分组到记录中,这样可以减少参数的数量并增加清晰度。

    当然,您可以使用您的解决方案,在fun中有一些隐式参数,在递归调用中有一些显式参数,但我不认为这会提高清晰度。

    同样的答案也适用于“普通”递归,在这种递归中,您要跨越数据结构。