Ошибка «Недопустимое выражение в страже, случай не разрешен в страже» - PullRequest
0 голосов
/ 14 мая 2018

Следующий код считается ошибкой mix:

case test do
      ...
      t when !is_list(t) -> false
      ...
end

Ошибка «Недопустимое выражение в страже, регистр не допускается в охране».

Однако, еслиЯ удаляю !, т.е. пишу

case test do
      ...
      t when is_list(t) -> false
      ...
end

, об ошибках не сообщается.

Это не может быть правильно?! должна быть просто функцией отрицания.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

! это не функция отрицания, это макрос.

См. Код в эликсире, lib/elixir/lib/kernel.ex: 1552,

 defmacro !value

  defmacro !{:!, _, [value]} do
    optimize_boolean(
      quote do
        case unquote(value) do
          x when :"Elixir.Kernel".in(x, [false, nil]) -> false
          _ -> true
        end
      end
    )
  end

  defmacro !value do
    optimize_boolean(
      quote do
        case unquote(value) do
          x when :"Elixir.Kernel".in(x, [false, nil]) -> true
          _ -> false
        end
      end
    )
  end

Раскрытый макрос ! - это case statement, что недопустимо в страже эликсира.

А не является функцией Эрланга:

  @spec not true :: false
  @spec not false :: true
  def not value do
    :erlang.not(value)
  end
0 голосов
/ 14 мая 2018

Я думаю, что это работает, если вы используете ключевое слово not вместо !.

Not разрешено в защитных испытаниях, ! не разрешено в защитных испытаниях.

...