gpt4 book ai didi

Erlang 与 Elixir 宏

转载 作者:行者123 更新时间:2023-12-02 12:47:34 27 4
gpt4 key购买 nike

我遇到了一些 Erlang 代码,我正在尝试将其转换为 Elixir,以帮助我学习这两种语言并理解它们之间的差异。一般来说,宏和元编程是我仍在努力理解的一个主题,所以希望您能理解我的困惑。

Erlang 代码

-define(p2(MAT, REP), 
p2(W = MAT ++ STM) -> m_rep(0, W, STM, REP))

% where m_rep is a function already defined.

对我来说,似乎在上面的代码中,有两个单独的 p2 宏定义,映射到一个名为 m_rep 的私有(private)函数。但在 Elixir 中,似乎只能有一种模式匹配定义。 Elixir 中是否也可以有不同的?

最佳答案

这不是两个定义。第一行是宏,第二行是替换。令人困惑的是,宏与它生成子句的函数具有相同的名称。例如,当像这样使用宏时:

?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".

在 Elixir 中,您也可以使用宏定义多个函数子句。它更冗长,但我认为它也更清晰。 Elixir 的等价物是:

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

你可以用它来定义多个函数子句,就像 erlang 的对应子句一样:

defmodule MyModule do
require MyMacros

MyMacros.p2('a', 'b')
MyMacros.p2('c', 'd')
end

关于Erlang 与 Elixir 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35060080/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com