以下代码显示了我所询问的一个示例: 为什么Map,Enum等不能在保护条款内或我自己的宏中使用。
defmodule GuardMod do
defmacro has_any_key(arg, keys) do
quote do
Map.keys(unquote(arg), unquote(keys)) |> Enum.any?
end
end
end
defmodule OtherMod do
import GuardMod
@doc """
has_any_key/2 is allowed, but Map.keys or Map.any not
"""
def fn1(list) when has_any_key(list, [:key1, :key2]), do: :nothing
end
答案 0 :(得分:3)
允许多功能头部调度“快速”是一种妥协。
守卫中允许的功能类型都具有有限的运行时间或减少计数。如果允许保护中的任意函数,则必须处理在当前进程超过当前执行切片之前保护评估未完成的情况。 (或者甚至更糟的情况是竞争条件,因为它需要来自另一个过程的输入)。