所以,我正在 Erlang 中制作一个 tic-tac-toe 游戏,它不断抛出语法错误,我不知道为什么。它发生在检查 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 语句中的第一个条件。)
有人知道这是为什么吗?
最佳答案
and
比 ==
绑定(bind)更紧密。以下是您的保护中的隐式括号:
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 。
关于Erlang 编译器不断抛出奇怪的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60637744/