Eiji
Hi, I looked about generating functions and found one example. I tried to make it work inside macro, but i don’t know how I can fix it. Here is sample code that I need help with:
defmodule FirstExample do
Enum.each [foo: [{:_arg1, [], nil}], bar: []], fn {func_name, args} ->
def unquote(func_name)(unquote_splicing(args)), do: :ok
end
end
defmodule SecondExample do
defmacro my_macro(name) do
quote do
defmodule unquote(name) do
Enum.each [foo: [{:_arg1, [], nil}], bar: []], fn {func_name, args} ->
def unquote(func_name)(unquote_splicing(args)), do: :ok
end
end
end
end
end
Please explain me:
- How
unquoteworks inFirstExample?
unquoteshould work only inside ofquote, right? - How I could correct
SecondExampleto make it work?
Important: I need these data to be insidedefmodule unquote(name) do ... endand I need to generate whole module)?
I can see thatunquotetries to get data outside ofquote, but i don’t know how I can fix it to make it work like inFirstExample.
Trending in Questions
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
I’m aware of 2 such projects, are there others?
git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
Hi all,
I’m working on a Phoenix project where I need to make external HTTP requests and I’m trying to choose between Req and HTTPoison....
New
Hi everyone.
My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
Hi,
we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New
Hi all, I’m new here and would like to hear peoples views on my Elixir/Phoenix based game-engine! :smiley:
Mutonex gamedesign was finish...
New
Hello
I’ve been coding in Elixir for almost two years now because of my current job where we implemented Elixir in our application. But ...
New
Other Trending Topics
Hey there,
I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first.
...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly)
AI dream has many faces, but general...
New
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself.
My main conc...
New
In 2021 I started a new library called Tempo with the objective of modelling time as a set of intervals - not as instants. In 2022 I gave...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #blog-post
- #ecto-query
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #hex










Showing Posts 1 to 9- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
mudasobwa
Use
Module.create/3that, as by documentation, “Creates a module with the given name and defined by the given quoted expressions.”Eiji
@mudasobwa: Thank you. It’s really helpful, but I still can’t get it work with my code
I have 3 problems:
eachcall (with another function names) then only last is added as module body (I can’t run other functions iniex). I want to pass whole module body there - not only last result of quote._buildfolder and compile whole project again - this is really uncomfortable.The workaround for 1st problem:
but I think it’s not a best idea.
I will try to describe better how my code works. In my version these looks like:
What do you think about it?
gregvaughn
I’m no macro expert, but don’t you want to be using
Enum.mapinstead ofEnum.eachso you can capture the generated AST?Eiji
@gregvaughn: Originally I’m using
Enum.each. I usedEnum.maponly to test @mudasobwa answer.Simply in
defmodule -> Enum.eachworks without error.There is a problem with args, because I can’t call
unquote_splicinginsidedefmodule -> defmacro -> quote -> Enum.each.Please try
SecondExamplecode in my first post for example iniex.mudasobwa
Don’t prepend the element to the list with
++, use[head | tail]notation:You seem to misheard what I was saying: one should not use
defmoduleinside macros/functions due to the unquoting scopes problems you’ve met. UseModule.create/3in such a case. There is no way (at least legit) tounquotefrom the middle level of nested quoting.Whether you are still positive you want to violate guidelines and how-tos provided by core team members, you might use a hack (read: a kludge) with
Code.eval_quoted/3as shown below:I do not see any problem here: add the module attribute declaration to the
contentsas shown below:NobbZ
Appending here is totally fine. If not elixir does it, erlang will optimise it away. It will optimise appending to a singleton list into consing.
Also, there is often no problem with appending to a list once, it does get dangerous when done recursively though.
mudasobwa
Yes, indeed, I should’ve put the better wording there. I meant “get a habit to use
[head | tail]notation, rather than[head] ++ tail, it might save you time for not thinking whether it’s a performance hit or not.”net
I’m guessing
@my_datais set by the block. You can split large quote into two quotes, and use[unquote: false]to disableunquote/1. Consider moving the first quote to a private function inMyLibfor better readability and maintainability.@gregvaughn
Enum.eachis fine in this case asdefjust inserts into an ets table.Eiji
@mudasobwa: Thanks, but these does not look good (or another words: these could look better), but your example is very, very good for simpler cases (your first example looks really nice).
I know
[head | tail]notation, but this was only example - i.e. at end I will rewrite it anyway, but I don’t know about what @NobbZ say - really interesting, thanks!You should agree with me that @net solution looks best for my case - i.e. there is no need to care about what quoted block returns which was exactly what I want. Just now I tested it with my code - it’s really little change in this case and it works as expected. For me it looks best, so I mark it as a answer.
Thank you all for your time and help!