Module Elixir重命名并包装Erlang模块?

Module Elixir重命名并包装Erlang模块?,module,erlang,elixir,Module,Erlang,Elixir,是否可以重命名现有的Erlang模块?我想在Elixir项目(断言库)中使用几个Erlang模块中的一些代码 我不想把所有的Erlang模块都转换成Elixir,因为它们是完整的,但我想重命名它们,并可能为它们添加额外的函数。这两个模块都只是函数的集合,它们不实现行为或执行任何异常操作 我希望能够使用现有的Erlang模块: -module(foo_erl). -export([some_fun/1]). some_fun(Arg) -> ok. 并编写一个Elixir模块来扩展

是否可以重命名现有的Erlang模块?我想在Elixir项目(断言库)中使用几个Erlang模块中的一些代码

我不想把所有的Erlang模块都转换成Elixir,因为它们是完整的,但我想重命名它们,并可能为它们添加额外的函数。这两个模块都只是函数的集合,它们不实现行为或执行任何异常操作

我希望能够使用现有的Erlang模块:

-module(foo_erl).

-export([some_fun/1]).

some_fun(Arg) ->
  ok.
并编写一个Elixir模块来扩展Erlang模块:

defmodule ExFoo do
   somehow_extends_erlang_module :foo_erl

   another_fun(arg) do
     :ok
   end
end
然后能够使用Erlang模块中定义的函数:

-module(foo_erl).

-export([some_fun/1]).

some_fun(Arg) ->
  ok.
iex(1)>ExFoo.some_乐趣(:arg)=>:ok


这在长生不老药中可能吗?如果是这样的话,我该怎么做呢?

这里是我可以建议的第一件事。我百分之百确信它能以更优雅的方式解决。因为我还不是长生不老药的大师,所以我稍后会回到这个话题上

defmodule Wrapper do
  defmacro __using__(module) do
    exports = module.module_info[:exports] -- [module_info: 0, module_info: 1]
    for {func_name, arity} <- exports do
      args = make_args(arity)
      quote do
        def unquote(func_name)(unquote_splicing(args)) do
          unquote(module).unquote(func_name)(unquote_splicing(args))
        end
      end
    end
  end

  defp make_args(0), do: []
  defp make_args(arity) do
    Enum.map 1..arity, &(Macro.var :"arg#{&1}", __MODULE__)
  end
end

defmodule WrapperTest do
  use ExUnit.Case, async: true

  use Wrapper, :lists

  test "max function works properly" do
    assert (max [1, 2]) == 2
  end
end
defmodule-Wrapper-do
使用(模块)do定义宏
导出=模块。模块信息[:导出]-[模块信息:0,模块信息:1]

对于{func_name,arity}通常,我们建议避免包装Erlang模块。如果您想以自动方式包装许多模块,velimir的帖子就在这里

但是,如果您有一次性的情况,您肯定希望包装一个Erlang模块,我建议您只需使用
defdelegate

defmodule MyLists do
  defdelegate [flatten(list), map(fun, list)], to: :lists
end

我有3个模块,我也需要这样做,但我选择使用defdelegate,因为它使包装显式。当有人打开
MyLists
模块时,他们将确切知道扁平化/1的定义位置。