为什么我们不能在Elixir保护条款或宏中使用其他函数?

时间:2017-06-09 19:15:03

标签: elixir

以下代码显示了我所询问的一个示例: 为什么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

1 个答案:

答案 0 :(得分:3)

允许多功能头部调度“快速”是一种妥协。

守卫中允许的功能类型都具有有限的运行时间或减少计数。如果允许保护中的任意函数,则必须处理在当前进程超过当前执行切片之前保护评估未完成的情况。 (或者甚至更糟的情况是竞争条件,因为它需要来自另一个过程的输入)。