在Erlang中,我何时使用;或,或.?

57

我一直在努力学习Erlang,但遇到了在函数和case语句中如何结尾的问题。

在函数或case语句中,何时使用分号(;),逗号(,)或句号?

5个回答

60

我喜欢将分号看作是或(OR),逗号看作是并且(AND),句号看作是结束。因此

foo(X) when X > 0; X < 7 ->
    Y = X * 2,
    case Y of
        12 -> bar;
        _  -> ook
    end;
foo(0) -> zero.

读作

foo(X) when X > 0 *OR* X < 7 ->
    Y = X * 2 *AND*
    case Y of
        12 -> bar *OR*
        _  -> ok
    end *OR*
foo(0) -> zero *END*
这应该能清楚地说明为什么在 case 的最后一个子句后面没有分号。

2
我刚开始学习Erlang,这非常有用。谢谢。 - Sid
2
好的例子,但是什么时候X > 0; X < 7会为假? - Jamie Forrest
非常有用的方法,非常自然。 - liuyanghejerry
1
我也刚开始学习Erlang,但我能否建议这样的评论: 在case语句的最后一个子句后面没有分号,因为分号不是在子句之后,而是在子句之间。分号和逗号表示子句之间的连接方式。句号标志着子句的结束(因此,它确实在结尾处)。 这种逻辑似乎来自于Erlang的Prolog起源,但我不能确定,我只读过《learnyousomeerlang》。干杯! - xealits

56

普通代码行末需要逗号。
case语句或if语句等末尾需要分号。 最后一个case或if语句末尾不需要任何内容。 函数末尾需要句号。

示例(对于随机变量名称表示抱歉,显然这不会做任何事情,但说明了一个观点):

case Something of 
    ok ->
        R = 1,     %% comma, end of a line inside a case 
        T = 2;     %% semi colon, end of a case, but not the end of the last
    error ->
        P = 1,     %% comma, end of a line inside a case
        M = 2      %% nothing, end of the last case
end.               %% period, assuming this is the end of the function, comma if not the end of the function

4
在函数子句的末尾使用分号,但这并不表示函数结束(用点号来结束函数,正如marcc所解释的那样)。 - Adam Lindberg
你可以用句点来结束一个命名函数。匿名函数则是用 end 关键字来终止。在 -include() 和 -compiler 指令中也要使用句点。最好将句点视为最终终止符。这是“END”,而逗号和分号是分隔符。正如下面的 chthulahoops 所说,逗号用于系列的分隔符,分号用于替代方案的分隔符。, = 和 & ; = 或者是一个相当不错的记忆方式。 - Jeremy Wall

29

句点(.)

在模块中,句点用于终止模块属性和函数声明(也称为“形式”)。可以通过记住形式不是表达式(没有返回值)来理解这一点,因此句点表示语句的结尾。

请注意,具有不同参数个数的函数定义被认为是单独的语句,因此每个语句都将以句点结束。

例如,对于hello/0hello/1的函数定义如下:

hello() -> hello_world.

hello(Greeting) -> Greeting.

(请注意,在Erlang shell中,句号用于终止和评估表达式,但这是一个异常情况。)

分号 (;)

分号用作子句分隔符,既可用于函数子句,也可用于表达式分支。

例如1,函数子句:

factorial(0) -> 1;
factorial(N) -> N * fac(N-1).

例子2,表达式分支:

if X < 0  -> negative;
   X > 0  -> positive;
   X == 0 -> zero
end

逗号 (,)

逗号是表达式分隔符。如果一个逗号跟在一个表达式之后,那么它意味着在该从句中还有另一个表达式。

hello(Greeting, Name) -> 
    FullGreeting = Greeting ++ ", " ++ Name,
    FullGreeting.

学习 Erlang 时困扰我的一件事是在最后一个子句末尾加上分号,例如,在示例2中的 X == 0 -> zero 后面加上分号。 - Tommy

3
您可以把它看作是英语标点符号。逗号用于分隔系列中的事物,分号用于分隔两个非常相关的独立子句(例如,case语句的不同情况,匹配不同模式的相同名称和arity的函数子句),句号用于结束一个句子(完整的思想)。
或者为了证明你上过大学。“不要使用分号。它们是跨性别的两性人,绝对代表着什么都没有。它们所做的就是显示你曾经上过大学。”——库尔特·冯内古特

3
喜欢范尼格特的这句话!我会注意在分号的使用上加强语调;他们确实应该被更多地使用。 - samoz
+1. Erlang的标点明显受到散文标点的启发,这对Erlang来说是不利的。 - Warren Young

3
逗号在IT技术中常用于分隔表达式、参数、列表/元组或二进制的元素。然而,它往往被过度使用。

我猜你会认可LFE作为这个问题的解决方案,但是它已经一年没有更新了Reia已经停止开发Efene已经7个月没有更新了,而"1.0 last call"在15个月前被无视了。在编译成BEAM语言中,只有Elixir似乎仍在开发中。 - Warren Young
@WarrenYoung,由于我是Erlang语法背后的人之一,所以我对它没有任何问题。 :-) LFE并没有死亡,它只是到达了需要一些严肃用户来获取改进和发展输入的阶段。作为Erlang的另一种Lisp语法,有Joxa。我个人不认为ruby-like语法有什么魅力。 - rvirding
是的,我知道你是谁。(“你好,罗伯特!”)我只是在想,如果你有机会重新开始,也许这次不会基于Prolog的语法来设计你的新语言。至于LFE,Lisp的市场份额约为1%,Erlang的市场份额约为1/3%,因此LFE的最大市场份额潜力约为0.0033%。它的可能潜力还要进一步降低,因为使用Erlang系统的用户中愿意使用第二个前端的比例很小。如果你不喜欢Ruby,那也无妨,但目前像Ruby这样的语言更受欢迎。 - Warren Young
@WarrenYoung 我不知道,也许吧。或者选择更像其他函数式语言的语法。我不会以C/Java为基础,因为我认为语义上的“契合度”太差了。我已经做了很多C编程,所以我非常习惯那种语法风格,对两者都没有问题。我不认为学习一种新的语法是一个问题,这只是RTFM中最不成问题的部分。 - rvirding
我们可以达成这样的共识:C++FE是一个永远不应该存在的项目。 :) - Warren Young
我们可以绝对地认同这一点。我碰巧喜欢Lisp语法,它简单而且非常灵活,因此有了LFE。但我真的不认为其他Erlang语法,甚至是LFE,能够成为标准语法的可行替代品;主要是因为在标准发行版中缺乏支持。 - rvirding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接