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

在Erlang中是否有一种惯用的方法来排序函数参数?

  •  12
  • pjb3  · 技术社区  · 15 年前

    似乎它在列表模块中不一致。例如,split的第一个参数是数字,第二个参数是列表,但子列表的第一个参数是列表,第二个参数是len。

    2 回复  |  直到 15 年前
        1
  •  19
  •   rvirding    15 年前

    好吧,我记得一些历史,还有我的风格背后的一些原则。

    正如克里斯蒂安所说,图书馆的发展趋向于从我们当时的冲动中获得争论的秩序和感觉。因此,举例来说,元素/setelement之所以具有它们所具有的参数顺序,是因为它与prolog中的arg/3谓词相匹配;逻辑上是“then”,但不是“now”。我们经常会有 事情 先工作,但不幸的是并非总是如此。这通常是一个很好的选择,因为它允许将“可选”参数方便地添加到末尾;例如字符串:SUBSTR/2/3。函数 事情 最后一个论点经常受到函数语言的影响,例如haskell,在这里很容易使用curring和部分评估来构建特定的函数,然后将其应用到 事情 . 这在列表中的高阶函数中非常明显。

    我们唯一没有的影响来自OO世界。-)

    通常,我们至少设法在一个模块内保持一致,但并非总是如此。再次查看列表。我们确实尝试了一些一致性,因此dict/集合中高阶函数的参数顺序与列表中相应函数的参数顺序相匹配。

    问题也因为我们, 特别是我 对图书馆的态度相当傲慢。我只是不把他们看作是语言的卖点,所以我并不担心。”如果你想要一个图书馆做点什么,那么你只需写下“这是我的座右铭”。这意味着我的库是结构化的,只是并不总是具有相同的结构。:-)这就是最初出现的库的数量。

    当然,这会造成不必要的混乱,并破坏最不令人吃惊的规律,但我们对此无能为力。任何修改模块的建议都会得到一个响亮的“不”。

    我个人的风格通常是结构化的,尽管我不知道它是否符合任何书面的指导方针或标准。

    我一般都有 事情 东西 我正在努力作为第一个论点,或者至少是非常接近开始;顺序取决于什么感觉最好。如果有一个全局状态被链接到整个模块中(通常是这样),则将其作为最后一个参数放置,并给出一个非常描述性的名称,如st0、st1、…。(我属于短变量名教会)。通过函数(输入和输出)链接的参数试图保持与返回顺序相同的参数顺序。这使得查看代码结构更加容易。除此之外,我试着把属于一起的论点分组。另外,在可能的情况下,我试图在整个模块中保持相同的论点顺序。

    这些都不是革命性的,但是我发现如果您保持一致的风格,那么就不必担心什么了,它会让您的代码感觉更好,而且通常更易于阅读。另外,如果参数顺序感觉错误,我会重写代码。

    有助于:

    fubar({f,A0,B0}, Arg2, Ch0, Arg4, St0) ->
        {A1,Ch1,St1} = foo(A0, Arg2, Ch0, St0),
        {B1,Ch2,St2} = bar(B0, Arg4, Ch1, St1),
        Res = baz(A1, B1),
        {Res,Ch2,St2}.
    

    在这里 Ch 是本地通过变量链接的,而 St 是一个更全球化的国家。如果您需要一个更长的示例,请查看Github上的LFE代码,尤其是编译器。

    抱歉,这比本应的时间长了很多。

    P.S.我用了这个词 事情 而不是 对象 为了避免对我所说的话产生混淆。

        2
  •  4
  •   Justin Sheehy    15 年前

    不,在你所指的意义上,没有一贯使用的成语。

    但是,有一些有用的相关提示,特别是当您要进行深度递归调用时。例如,在尾部调用期间,保持参数列表中的相同顺序/位置不变,这允许虚拟机进行一些非常好的优化。