Erlang vs Elixir Macros -
i have came across erlang code trying convert elixir me learn both of languages , understand differences. macros , metaprogramming in general topic still trying head around, understand confusion.
the erlang code
-define(p2(mat, rep), p2(w = mat ++ stm) -> m_rep(0, w, stm, rep)) % m_rep function defined.
to me, seems in above code, there 2 separate definitions of p2
macro map private function called m_rep
. in elixir though, seems possible have 1 pattern matching definition. possible have different ones in elixir too?
these not 2 definitions. first line macro, second line replacement. confusing bit macro has same name function generating clauses. example when using macro this:
?p2("a", "b"); ?p2("c", "d").
the above expanded to:
p2(w = "a" ++ stm) -> m_rep(0, w, stm, "b"); p2(w = "c" ++ stm) -> m_rep(0, w, stm, "d").
you can use erlc -p
produce .p
file show effects of macro expansion on code. check out simpler, compilable example:
-module(macro). -export([foo/1]). -define(foo(x), foo(x) -> x). ?foo("bar"); ?foo("baz"); ?foo("qux").
using erlc -p macro.erl
following output macro.p
:
-file("macro.erl", 1). -module(macro). -export([foo/1]). foo("bar") -> "bar"; foo("baz") -> "baz"; foo("qux") -> "qux".
in elixir can define multiple function clauses using macros well. more verbose, think clearer. elixir equivalent be:
defmodule mymacros defmacro p2(mat, rep) quote def p2(w = unquote(mat) ++ stm) m_rep(0, w, stm, unquote(rep)) end end end end
which can use define multiple function clauses, erlang counterpart:
defmodule mymodule require mymacros mymacros.p2('a', 'b') mymacros.p2('c', 'd') end
Comments
Post a Comment