Hi,
I pursued my investigations further, and modified the Foo.show/1 function as follow.
defmodule Foo do
defmacro show(frag = {:__aliases__, _, refs}) do
resolved = Macro.expand(frag, __CALLER__)
IO.puts """
Alias
frag \t #{inspect frag}
resolved #{inspect resolved}
"""
frag
end
defmacro show(frag = {{:., _, [path, target]}, _, _}) do
resolved = Macro.expand(path, __CALLER__)
IO.puts """
Call
path \t #{inspect path}
resolved #{inspect resolved}#{inspect target}
"""
frag
end
end
Basically I catch fragments bearing aliasing information to make some experiments.
Here is the output
Alias
frag {:__aliases__, [counter: 0, line: 38], [:A]}
resolved Outer
Alias
frag {:__aliases__, [counter: 0, line: 39], [:B]}
resolved Outer.Inner
Alias
frag {:__aliases__, [counter: 0, line: 40], [:C]}
resolved Outer.Inner
Call
path {:__aliases__, [counter: 0, line: 41], [:C]}
resolved Outer.Inner:foo
ast {:__aliases__, [alias: Outer], [:A]}
We can see that, though fragments do not bear aliasing information, Macro.expand resolves aliases at compile time.
Cheers
Nicolas -
P.S. The question may rise of knowing WHY I needed to have those resolved symbols. Well, I wanted to be able to take some decisions based on the knowledge that a function is exported by a certain module … it proved to be a wrong way, but the underlying purely technical is still interesting ![]()


















