受到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的实际实现。我在哪里可以找到它们?第二,如果有人也知道解释为什么这样组织?
答案 0 :(得分:3)
lists
BIF在erts/emulator/beam/erl_bif_lists.c
中实施。诸如lists
之类的大量使用标准模块的部分被实现为BIF以提高效率和性能。