Hello, Based on typed_struct/lib/typed_struct.ex at main · ejpcmac/typed_struct · GitHub , I am practicing to learn more about macro in elixir, all the things are good but I can not delete the attr
I register in module.
For example this is my macro
@temporary_revaluation [
:gs_fields,
:gs_types,
:gs_enforce_keys
]
defmacro guardedstruct(opts \\ [], do: block) do
ast = register_struct(block, opts)
quote do
(fn -> unquote(ast) end).()
end
end
def register_struct(block, opts) do
quote do
Enum.each(unquote(@temporary_revaluation), fn attr ->
Module.register_attribute(__MODULE__, attr, accumulate: true)
end)
Module.put_attribute(__MODULE__, :gs_enforce?, unquote(!!opts[:enforce]))
@before_compile {unquote(__MODULE__), :delete_temporary_revaluation}
...
end
end
So the macro deletes attrs
is:
defmacro delete_temporary_revaluation(%Macro.Env{module: module}) do
Enum.each(unquote(@temporary_revaluation), &Module.delete_attribute(module, &1))
end
With these codes I try to delete module attributes. but inside the module I use this macro, I can still access to all the
@temporary_revaluation [
:gs_fields,
:gs_types,
:gs_enforce_keys
]
For example:
defmodule MishkaPub.ActivityStream.Type.Object do
use GuardedStruct
guardedstruct do
field(:id, String.t())
field(:type, String.t())
end
def list_attributes do
@gs_fields
end
end
As you see I can print @gs_fields
. but inside the macro I tell delete all of them before compile!!
I want to handle this inside macro not the module
Please help me to find what is the problem?
Full code:
Thank you in advance