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 in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app?
Looking for hints regarding:
Addi...
New
Hi all, I wanted to ask how the community is dealing with post-release steps.
Today we have Ecto migrations, which make sure that the db...
New
Kia ora,
We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
Hello,
I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New
Other Trending Topics
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
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
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










First 9 of 9 Posts
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!