alichoopani
hello everyone.
I am trying to learn metaprogramming and start with simple project. in this road I this weird situation.
I want to implement interface like action_fallback macro in Phoenix controller(inside UseSample module).
defmodule GuardModule do
def test() do
IO.inspect("TEST")
end
end
defmodule Sample do
defmacro guard(module_name) do
quote do
@guard unquote(module_name)
end
end
defmacro __using__(_opts) do
quote do
import unquote(__MODULE__)
Module.register_attribute(__MODULE__, :guard, accumulate: :false, persist: :false)
@before_compile unquote(__MODULE__)
end
end
defmacro __before_compile__(env) do
custom_guard = Module.get_attribute(env.module, :guard)
custom_guard.test()
# quote do
# def test_inside_use_sample() do
# custom_guard.test()
# end
# end
end
end
defmodule UseSample do
use Sample
guard GuardModule
end
now I have some questions.
- in
Sample.__before_compile__macro i can call external module functions. but i can’t generate function that call this external function inside its body(commented section not compile). how can I do that? - in this situation
GuardModulecompiles before others because it’s in the beginning of file. how can I force elixir compiler to compile this module beforeSamplemodule? - and finally am i have right solving strategy for this problem or should do something else?
thanks a lot.
Trending in Questions
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
Hello,
I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind.
However, when I launch mix phx.server, I get an error...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
I’m working on a small exercise involving update_in/3, and I came up with this solution:
data = %{
name: "Periodic Table",
category:...
New
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication):
toke...
New
Other Trending Topics
Edit: 2026 May 15 - This post is archived.
Mob is alive!!
Main docs: mob v0.7.11 — Documentation
A bit of explanation for the slightly c...
New
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
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
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
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
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex










Showing Posts 1 to 2- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
hst337
You forgot
unquoteTry using higher order functions
rvirding
There are no problems for you to load in your version of that module again. There is no way to stop anyone from loading in new versions of any module. However there are some properties of code handling you should be aware of:
There can at most be 2 versions of a module at the same time, the current and the old. When a new version is loaded in the old version is automatically and irrevocably deleted, the current version becomes the “new” old and the the new one becomes the “new” current.
The system doesn’t try and be smart and say that if you already have the version of the module loaded it won’t reloaded It does what you tell it to.
The code handling also kills all the processes using the old version of a module when that is deleted.
This leads to some fun things. If you reload a module twice you are guaranteed to kill all processes running it regardless of which version they are running.
When you call a function in a module which version you call depends on how it is called. If you make a local call you always get the same version while if you make a fully qualified call,
Module.function, you always get a the current version. There is no way to explicitly call functions in the old versions from the “outside”.Sorry for a quick description of code handling in the BEAM/Erlang/Elixir.