“防护中的表达式无效,防护中不允许大小写”错误

时间:2018-05-14 11:28:35

标签: pattern-matching elixir

以下代码被mix视为错误:

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

错误是“警卫中的表达式无效,警卫不允许使用案例”。

但是,如果我删除!,即写

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

没有报告错误。

这不可能是对的吗? !应该只是否定函数。

2 个答案:

答案 0 :(得分:4)

我认为如果您使用关键字not而不是!,则可行。

在守卫测试中允许

Not,在守卫测试中不允许!

答案 1 :(得分:1)

!不是否定函数,它是一个宏。

请参阅elixir中的代码,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,不允许使用长生不老药。

而不是erlang函数:

  @spec not true :: false
  @spec not false :: true
  def not value do
    :erlang.not(value)
  end