當我們把共同的邏輯抽出成套件時,有時後會需要規定使用的模組有定義特定的函式作為 callback,
除了之前介紹過得 behaviour 來規定之外,我們也可以使用巨集來幫使用套件的模組自動建立函式。
use當有一個模組 use 我們的套件模組 MyMacro 時,Elixir 會執行 MyMacro.__using__/1,
通常這個時候我們會在 MyMacro 模組裡面定義一個叫做 __using__/1 的巨集來接這個呼叫。
(__using__, 的為一個變數為, use 的第二個 keyword list 變數)
首先是我們的 MyMacro 模組
defmodule MyMacro do
  defmacro __using__(opts) do
    function_name = opts[:name]
    quote do
      def unquote(function_name)() do
        "FUWWA"
      end
    end
  end
end
接著在 Demo 模組裡面使用 use 並帶入變數
defmodule Demo do
  use MyMacro, name: :sunsun
end
因為我們的 __using__ 巨集裡面的 quote
定義了根據傳入的名稱定義了新的函數
所以在 Demo 模組 use MyMacro, name: :sunsun 之後
我們就可以使用
Demo.sunsun
#=> "FUWWA"