Elixir “长生不老药错误”;erlang错误::guard_expr";
在Elixir “长生不老药错误”;erlang错误::guard_expr";,elixir,Elixir,在iex控制台上,我发现以下错误,我不确定我做错了什么 case %{} do x when x == %{} -> true _x -> false end 导致以下错误: ** (ErlangError) erlang error: :guard_expr 另外,我想解释一下我是如何发现这个的。我试图通过查看elixir的实现并将其更改为处理[],{}和%{}与false和nil相同,来创建自己的|宏。 下面是该实现(它有相同的问题): 去掉或x==%{}可以让事情
iex
控制台上,我发现以下错误,我不确定我做错了什么
case %{} do
x when x == %{} -> true
_x -> false
end
导致以下错误:
** (ErlangError) erlang error: :guard_expr
另外,我想解释一下我是如何发现这个的。我试图通过查看elixir的实现并将其更改为处理[]
,{}
和%{}
与false
和nil
相同,来创建自己的|
宏。
下面是该实现(它有相同的问题):
去掉
或x==%{}
可以让事情顺利进行。这似乎是一个Erlang bug。以下是重现问题的erlang代码:
case #{} of X when X == #{} -> X end.
谢谢大家的确认!有关详细信息,请参阅评论。Strange。使用变量代替文本编译,即:
y=%{};案例y,do:(x当x==y->true;_x->false)
Yes,并且它唯一导致问题的映射,[]或其他东西不会使它崩溃。奇怪的是,当在函数定义中使用相同的保护时,它不会崩溃……这似乎是一个Erlang错误。我可以在纯Erlang壳中复制这个。我找不到关于这种行为的任何参考资料。在任何情况下,直到解决这个问题,你应该考虑一些解决办法,比如由@基督教提出的一个。也许在Erlang Bug邮件列表()上。这是复制它的Erlang代码:X的case{}当X==={{}->X结束时。
我应该提到我尝试过使用Erlang 17.0。也许它是固定在17.4,但我没有安装它来验证。
case #{} of X when X == #{} -> X end.