Is there a resource that would help me understand how defmacro can be defined as a macro via defmacro?

I’m trying to better understand how compilation and the AST works. I’m starting to grasp the whole “compiling elixir is the same thing as running elixir” concept but my brain is starting to warp trying to understand how Kernel.defmacro/2 works i.e

``````  defmacro defmacro(call, expr \\ nil) do
define(:defmacro, call, expr, __CALLER__)
end
``````

i.e `defmacro defmacro`

This feels like turtles all the way down. Where’s “bottom” so to speak? Is this some detail of how the language is bootstrapped?

I don’t expect someone to take the time to explain everything I might need to know to grok this, but is there an existing resource that does? Would reading Chris’ Metaprogramming in Elixir book help me grasp this?

1 Like

Indeed, its the bootstrapping…

Lets take a look at the top of the file that defines the `Kernel` module:

As you can see it indeed starts with `import`ing the `Kernel` module, except all those macros and function it uses later on.

Then it `import`s the `:elixir_bootstrap` module, which again contains the actual defintion of, eg. `defmacro` in erlang.

or the `define` function called in the `Kernel.defmacro` implementation:

4 Likes

Thanks so much!