riccardomanfrin
Quote, defmacro and modules
I’m trying to understand how macros and module definitions interact with each others and I’m having few cases which I don’t understand. The below example has some pseudo doctest to show my doubts.
What I need is to support case 5. Thanks for the support in advance
defmodule Foo do
@doctest """
Case 1 OK: Trivial (and useless) case.. (Foo.Case1)
iex> Foo.Case1.foo
"local stuff"
Case 2 OK: Injects the Case2 in WrapMod and uses its args
WARNING: comment Case4 for this to work (head scratching)
iex> WrapMod.Case2.foo
[foo: "bar"]
Case 3 FAILED!!!! Injects used args into the Foo.Case3.foo function
Error:
example.ex:24: undefined function args/0 (expected Foo.Case3 to define
such a function or for it to be imported, but none are available)
Desiderata:
iex> Foo.Case3.foo
[foo: "bar"]
Case 4 KINDA NOT OK: Super clunky combo of case 2 and 1
It works, but it HIDES!!!!! Case 2: Call to `WrapMod.Case2.foo` is not available
anymore
iex> WrapMod.Case4.foo
"local stuff"
iex> WrapMod.Case2.foo
UndefinedFunctionError
Case 5 FAILED: Hyper clunky combo of case 2 with case 3 <- which is not working :(
This is where I'd want to get to: I would like to be able to invoke
and use the evaluated Foo.Case3.foo from within the quoted Case5 quoted module code
"""
defmacro __using__(args) do
#Case 1
defmodule Case1 do
def foo() do
"local stuff"
end
end
#Case 2
quote do
defmodule Case2 do
def foo() do
unquote(args)
end
end
end
#Case 3
#defmodule Case3 do
# def foo() do
# quote do
# unquote(args)
# end
# end
#end
# Case 4: comment me to get back WrapMod.Case2.foo which is otherwise no more available!!!
quote do
defmodule Case4 do
def foo() do
Case1.foo()
end
end
end
#quote do
# defmodule Case5 do
# def foo() do
# Case3.foo()
# end
# end
#end
end
end
defmodule WrapMod do
use Foo, foo: "bar"
end
For the records, case 3 works if I change it like this:
#Case 3
defmodule Case3 do
def foo() do
quote do
var!(args)
end
end
end
but this is giving me
iex(1)> Foo.Case3.foo
{:var!, [context: Foo.Case3, import: Kernel], [{:args, [], Foo.Case3}]}
which is clearly not what I want
Most Liked
fuelen
As in regular functions, macro returns the last expression.
It is not necessary to wrap two quote expressions into a list. You can simply wrap both module definitions into 1 quote block:
quote do
defmodule Case2 do
def foo() do
unquote(args)
end
end
defmodule Case4 do
def foo() do
Case1.foo()
end
end
end
1
Popular in Questions
Hi,
I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
If I have a post route which an argument:
post /my_post_route/:my_param1, MyController.my_post_handler
How would get the post params ...
New
Hi All,
I set a environment variables in dev.exs , like below code.
when i start server, how can i set the ${enable} value?
thanks.
d...
New
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
Other popular topics
Hello, how can I check the Phoenix version ?
Thanks !
New
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









