Erlang компилятор продолжает выдавать странную синтаксическую ошибку - PullRequest
2 голосов
/ 11 марта 2020

Итак, я делаю ti c -ta c -очень игру в Erlang, и она продолжает выдавать синтаксическую ошибку, и я не знаю почему. Это происходит в функции, чтобы проверить, выиграл ли Х. Вот код:

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.)

Кто-нибудь знает, почему это так?

1 Ответ

4 голосов
/ 11 марта 2020

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

Однако, даже если вы добавите скобки в вашу охрану, вы столкнетесь со следующей ошибкой со своей охраной. См. Эрланг Страж в документах. Очевидно, что вы не можете вызывать любую функцию в охране - есть только ограниченное количество функций, которые можно вызывать в защите, и разрешенные функции перечислены в документации.

Я предлагаю вам начать с , вместо and при написании охранников, а затем настроить, если вам нужно что-то еще, например, и также .

...