Skip to content

Instantly share code, notes, and snippets.

@allenyang79
Last active February 3, 2018 09:35
Show Gist options
  • Save allenyang79/dafee662f75ef737561871a0ea0815f3 to your computer and use it in GitHub Desktop.
Save allenyang79/dafee662f75ef737561871a0ea0815f3 to your computer and use it in GitHub Desktop.
macro & use in module

Elixir的macro & use

可以用defmacro __using__來給之用use的modue,module自動產生預設的method

或者新增新的keyword, 雖然非必要不建議新增太多自定的macro elixir的if else或者ExUnit都有用到

defmodule Logger do
defmacro log(msg) do
if Application.get_env(:logger, :enabled) do
quote do
IO.puts("Logged message: #{unquote(msg)}")
end
end
end
end
defmodule Example do
require Logger
def test do
Logger.log("This is a log message")
end
end
defmodule Hello do
defmacro __using__(opts) do
greeting = Keyword.get(opts, :greeting, "Hi")
quote do
def hello(name), do: unquote(greeting) <> ", " <> name
end
end
end
defmodule UseHello do
use Hello, greeting: "Halo"
@greeting "Hello"
def greeting(name) do
"#{@greeting} #{name}."
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment