Help with __using__ macro

Hi! I’m playing around with macros but I got stuck deduplicating a piece of code.

defmodule SomeMap do
  def load(file_path) do
    file_path
    |> File.read!()
    |> Jason.decode!()
  end

  defmacro __using__(file_path) do
    quote do
      @map unquote(Macro.escape(load(file_path)))

      def load(file_path) do
        unquote(&load/1)(file_path)
      end
    end
  end
end

As you can see, in this example I want to use load for two things, loading some map into an attribute at compile time, and also insert the function into the using module so that I can load the same thing at runtime. I’ve tried many variations of it, but eg this version errors with Compilation Error: invalid call #Function<0.85068536/1 in SomeSchema."MACRO-__using__"/2>(file_path).

Disclaimer: this is for learning, I realise I could do this without a macro.

1 Like
defmacro __using__(file_path) do
    quote do
      @map unquote(Macro.escape(load(file_path)))

      def load(file_path) do
        unquote(__MODULE__).load(file_path)
      end
    end
  end
6 Likes

Oh, I knew I was missing something, thanks!

1 Like