0
我正在創建一個API,其中一個匿名函數由宏組成,例如,通過宏創建匿名函數
transform [x, y], do: x + y
transform x, do: x
應該使用transform
head
和body[:do]
的頭部和身體的匿名函數。例如,上面的宏調用上面的例子應該被收集到:
fn [x, y] -> x + y; x -> x end
隨着所享有片段可以很容易地創建新的命名功能def
S,而不是新的匿名功能:
iex> val = 1
iex> fn() -> unquote(val) end
** (CompileError) iex:99: unquote called outside quote
(elixir) src/elixir_exp_clauses.erl:23: :elixir_exp_clauses.clause/5
(elixir) src/elixir_fn.erl:33: anonymous fn/3 in :elixir_fn.expand/3
(stdlib) lists.erl:1237: :lists.map/2
(elixir) src/elixir_fn.erl:36: :elixir_fn.expand/3
這裏是我的目前進展:
defmacro anonymous_fn(parts) do
quote bind_quoted: [parts: parts] do
fn_branches = for {head, body} <- parts, do: {:->, [], [[head], body]}
unquote({:fn, [], fn_branches})
end
end
然而,嵌套所享有失敗,同樣的unquote called outside quote
錯誤。
在這一點上,我只是要使用一個普通的匿名函數,宏觀方法是矯枉過正,但我仍然有興趣知道這是否可能。
在此先感謝!
阿爽 - 巧妙的靈藥。謝謝! – jtmoulia