這些不是兩個定義。第一行是宏,第二行是替換。令人困惑的是,這個宏與它生成子句的函數名稱相同。使用例如,當你這樣的宏:
?p2("a", "b");
?p2("c", "d").
以上將擴大到:
p2(w = "a" ++ stm) -> m_rep(0, w, stm, "b");
p2(w = "c" ++ stm) -> m_rep(0, w, stm, "d").
您可以使用erlc -P
產生.P
文件會告訴你宏觀膨脹的影響你的碼。看看這個稍微簡單,編譯例如:
-module(macro).
-export([foo/1]).
-define(foo(X),
foo(X) -> X).
?foo("bar");
?foo("baz");
?foo("qux").
使用erlc -P macro.erl
你會得到下面的輸出macro.P
:
-file("macro.erl", 1).
-module(macro).
-export([foo/1]).
foo("bar") ->
"bar";
foo("baz") ->
"baz";
foo("qux") ->
"qux".
在靈藥,你可以定義使用宏,以及多個功能的條款。它更冗長,但我認爲它也更清晰。仙丹相當於是:
defmodule MyMacros do
defmacro p2(mat, rep) do
quote do
def p2(w = unquote(mat) ++ stm) do
m_rep(0, w, stm, unquote(rep))
end
end
end
end
,你可以用它來定義多個功能的語句,就像二郎神對方:
defmodule MyModule do
require MyMacros
MyMacros.p2('a', 'b')
MyMacros.p2('c', 'd')
end
我不知道你是否熟悉C和Lisp,但簡單的比喻是Erlang的宏像C宏(這是簡單的編譯時字符串替換),Elixir的宏像Lisp宏(即代碼可以操縱AST)。 –
@OnorioCatenacci這非常有趣!非常感謝你幫助我理解。 :-) – plotplot