Elixir错误 "erlang error: :guard_expr"

9

iex控制台上,我发现了以下错误,但我不确定我做错了什么...

case %{} do
  x when x == %{} -> true
  _x -> false
end

以下是翻译的结果:

会导致以下错误:

** (ErlangError) erlang error: :guard_expr

此外,我想解释一下我是如何找到这个问题的。我试图通过查看Elixir的实现并将其更改为将[]{}%{}视为falsenil来创建自己的||宏。https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/kernel.ex#L2313 以下是该实现(它具有相同的问题):
defmodule Or do
  defmacro left || right do
    quote do
      case unquote(left) do
        x when x in [false, nil] or x == [] or x == {} or x == %{} ->
          unquote(right)
        x ->
          x
      end
    end
  end
end

取走or x == %{}即可使事情正常运作。

1
奇怪。在文字的位置使用变量是可以编译通过的,例如:y = %{}; case y, do: (x when x == y -> true; _x -> false) - Christian
奇怪的是,当这个相同的守卫在函数定义中使用时,它不会崩溃... - mgwidmann
4
看起来这是一个 Erlang 的 bug。我在纯 Erlang shell 中可以重现这个 bug,但我无法找到任何关于此行为的参考资料。不管怎样,在问题得到解决之前,你应该考虑一些解决方法,比如 @Christian 提出的那个。 - sasajuric
我应该在哪里报告?erlang/otp的Github仓库似乎不接受问题。 - mgwidmann
1
也许可以在Erlang错误邮件列表(http://erlang.org/mailman/listinfo/erlang-bugs)上找到答案。这是能够重现问题的Erlang代码:`case #{} of X when X == #{} -> X end.` 我应该提一下,我已经尝试过Erlang 17.0版本。也许在17.4版本中已经修复了,但我没有安装来验证。 - sasajuric
显示剩余3条评论
1个回答

1

这似乎是一个Erlang bug。以下是重现此问题的Erlang代码:

case #{} of X when X == #{} -> X end.

感谢大家的确认!更多详细信息请参见评论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接