【问题标题】:Erlang compiler keeps throwing strange syntax errorErlang编译器不断抛出奇怪的语法错误
【发布时间】:2020-06-23 12:55:02
【问题描述】:

所以,我正在用 Erlang 制作一个井字游戏,它不断抛出语法错误,我不知道为什么。它发生在检查 X 是否获胜的函数中。代码如下:

checkX(["xxx" | _]) -> true;
checkX([_ | ["xxx" | _]]) -> true;
checkX([_ | [_ | ["xxx" | _]]]) -> true;
checkX(Board) ->
    if 
        xy(Board, {0, 0}) == 120 and xy(Board, {0, 1}) == 120 and xy(Board, {0, 2}) == 120 -> true;

        xy(Board, {1, 0}) == 120 and xy(Board, {1, 1}) == 120 and xy(Board, {1, 2}) == 120 -> true;

        xy(Board, {2, 0}) == 120 and xy(Board, {2, 1}) == 120 and xy(Board, {2, 2}) == 120 -> true;

        xy(Board, {0, 0}) == 120 and xy(Board, {1, 1}) == 120 and xy(Board, {2, 2}) == 120 -> true;

        xy(Board, {2, 0}) == 120 and xy(Board, {1, 1}) == 120 and xy(Board, {0, 2}) == 120 -> true;

       true -> false

    end.

xy/2 是一个函数,它接受一个板(它是一个字符串列表)和一个元组并返回元组中位置的字符。)当我编译它时它一直抛出这个错误:

board.erl:68: syntax error before '=='

(第 68 行是 if 语句中的第一个条件。)

有人知道这是为什么吗?

【问题讨论】:

    标签: erlang syntax-error


    【解决方案1】:

    and 的绑定比== 更紧密。以下是您的后卫中的隐式括号:

    xy(Board, {0, 0}) == (120 and xy(Board, {0, 1}))
    

    这不是你想要的。你的整个守卫最终类似于:

    if 
       Board == 2 == 3 -> true;
       true -> false
    end
    

    这会产生相同的错误。您可以使用一些括号来修复错误:

    if 
       (Board == 2) == 3 -> true;
       true -> false
    end
    

    然而,即使你给你的守卫添加了括号,你也会遇到下一个你的守卫错误。请参阅文档中的erlang guards。也就是说,你不能只调用守卫中的任何函数——在守卫中只能调用有限数量的函数,并且允许的函数在文档中列出。

    我建议您在编写守卫时以, 而不是and 开头,然后在您需要其他内容时进行调整,例如andalso

    【讨论】:

    • 谢谢!在大多数其他语言中,== 比 and 运算符绑定得更紧密,所以我有点困惑。
    猜你喜欢
    • 2016-02-09
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多