Erlang BIFs里面列出了模块

时间:2016-06-12 20:34:56

标签: erlang

受到this问题的启发,我很想知道在lists:reverse/2模块内的源代码中如何实现lists.erl
我发现lists:reverse/2内部lists.erl没有实施,但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的实际实现。我在哪里可以找到它们?第二,如果有人也知道解释为什么这样组织?

1 个答案:

答案 0 :(得分:3)

lists BIF在erts/emulator/beam/erl_bif_lists.c中实施。诸如lists之类的大量使用标准模块的部分被实现为BIF以提高效率和性能。