View Source Bunch.Macro (Bunch v1.6.1)
A bunch of helpers for implementing macros.
Summary
Functions
Receives an AST and traverses it expanding all the nodes.
Imitates import functionality by finding and replacing bare function
calls (like foo()) in AST with fully-qualified call (like Some.Module.foo())
Imitates import functionality by finding and replacing bare function
calls (like foo()) in AST with fully-qualified call (like Some.Module.foo())
Works like Macro.prewalk/2, but allows to skip particular nodes.
Works like Macro.prewalk/3, but allows to skip particular nodes using an accumulator.
Functions
@spec expand_deep(Macro.t(), Macro.Env.t()) :: Macro.t()
Receives an AST and traverses it expanding all the nodes.
This function uses Macro.expand/2 under the hood. Check
it out for more information and examples.
Imitates import functionality by finding and replacing bare function
calls (like foo()) in AST with fully-qualified call (like Some.Module.foo())
Receives AST fragment as first parameter and a pair {Some.Module, :foo} as second
Imitates import functionality by finding and replacing bare function
calls (like foo()) in AST with fully-qualified call (like Some.Module.foo())
Receives AST fragment as first parameter and list of pairs {Some.Module, :foo} as second
Works like Macro.prewalk/2, but allows to skip particular nodes.
Example
iex> code = quote do fun(1, 2, opts: [key: :val]) end
iex> code |> Bunch.Macro.prewalk_while(fn node ->
...> if Keyword.keyword?(node) do
...> {:skip, node ++ [default: 1]}
...> else
...> {:enter, node}
...> end
...> end)
quote do fun(1, 2, opts: [key: :val], default: 1) end
@spec prewalk_while( Macro.t(), any(), (Macro.t(), any() -> {:enter | :skip, Macro.t(), any()}) ) :: {Macro.t(), any()}
Works like Macro.prewalk/3, but allows to skip particular nodes using an accumulator.
Example
iex> code = quote do fun(1, 2, opts: [key: :val]) end
iex> code |> Bunch.Macro.prewalk_while(0, fn node, acc ->
...> if Keyword.keyword?(node) do
...> {:skip, node ++ [default: 1], acc + 1}
...> else
...> {:enter, node, acc}
...> end
...> end)
{quote do fun(1, 2, opts: [key: :val], default: 1) end, 1}