cpiemontese
Injecting code in macro with references to outer scope
Hello!
I’m working with macros and I am trying to inject some code into a use macro to be used “as-is” but I’m having some trouble making it work.
I would like to be able to define a __using__ macro which takes some options and creates a function that can use those options “as-is” i.e. if I pass Application.get_env(...) it will get the env at the time of the call, something like
defmodule HypotheticMod do
# Let's assume this will create a foo function
# which returns the value of Application.get_env(:app, :foo, 0)
use InjectMacro, option: Application.get_env(:app, :foo, 0)
def get_foo_from_env(), do: foo()
end
The first version I tried was this
Application.delete_env(:app, :test)
defmodule Foo do
defmacro __using__(opts) when is_list(opts) do
foo = Keyword.get(opts, :foo)
quote do
def func() do
unquote(foo)
end
end
end
end
defmodule Bar do
a = 1
use Foo, foo: Application.get_env(:app, :test, a)
end
a = 2
Application.put_env(:app, :test, a)
Bar.func()
and I expected Bar.func() to output 2, but I get the following error:
function a/0 (expected Bar to define such a function or for it to be imported, but none are available)
Next I tried this
Application.delete_env(:app, :test)
defmodule Foo do
defmacro __using__(opts) when is_list(opts) do
foo = Keyword.get(opts, :foo)
quote bind_quoted: [foo: foo] do
def func() do
unquote(foo)
end
end
end
end
defmodule Bar do
a = 1
use Foo, foo: Application.get_env(:app, :test, a)
end
a = 2
Application.put_env(:app, :test, a)
Bar.func()
which returns 1 for some reason I don’t understand.
I am surely missing something, can anyone help me?
Thanks ![]()
Popular in Questions
I have an umbrella app.
Some of the apps inside depend on other apps in the umbrella, unsurprisingly.
I’m writing a test for one of the...
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
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
Hi,
I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
Other popular topics
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine)
This is a plugin that adds support for Elixir to JetBrains IntelliJ...
New
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
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum.
...
New
Hi,
I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
What learn first? Rust or Elixir
Hi Elixir community!
I’m here because i want learn a new language. I’m a junior developer and mainly i ...
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
- #api
- #forms
- #metaprogramming
- #security
- #hex









