【问题标题】:Erlang BIFs inside lists module列表模块中的 Erlang BIF
【发布时间】:2016-06-13 04:55:03
【问题描述】:

this问题的启发,我很想知道lists:reverse/2是如何在lists.erl模块内的源代码中实现的。
我发现lists.erl里面没有lists:reverse/2的实现,但是lists:reverse/1有一个使用lists:reverse/2的实现:

reverse([] = L) ->
    L;
reverse([_] = L) ->
    L;
reverse([A, B]) ->
    [B, A];
reverse([A, B | L]) ->
    lists:reverse(L, [B, A]).

在文件的顶部有几行表明lists:reverse/2(和其他一些函数)是 BIF:

%%% BIFs
-export([keyfind/3, keymember/3, keysearch/3, member/2, reverse/2]).

...

%% Shadowed by erl_bif_types: lists:reverse/2
-spec reverse(List1, Tail) -> List2 when
      List1 :: [T],
      Tail :: term(),
      List2 :: [T],
      T :: term().

reverse(_, _) ->
    erlang:nif_error(undef).

问题:首先,我找不到这些 BIF 的实际实现。我在哪里可以找到它们?其次,如果有人也知道解释为什么它是这样组织的?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    lists BIF 在erts/emulator/beam/erl_bif_lists.c 中实现。部分常用标准模块(例如 lists)被实现为 BIF,以提高效率和性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      相关资源
      最近更新 更多