bif 一覧

同じく、 cooldaemon さんの結果で、

lists モジュール、自前の関数、リスト内包表記の速度比較 - cooldaemonの備忘録
検証コードを繰り返し実行した所、lists:reverse/1 の方が、自前の関数より早い事の方が多かった。

http://d.hatena.ne.jp/cooldaemon/20080820/1219209698

というものがある。これも根っこがきになる。
まずは、bif.tab をみてみる。erlang/otp の src を解凍したところの、 erts/emulator/bean/bif.tab に BIF の一覧がある。そこで、lists を探すと、以下が記述されてる。

bif lists:member/2
bif 'erl.lang.list':is_element/2	ebif_list_is_element_2 lists_member_2
bif lists:reverse/2
bif 'erl.lang.list':reverse/2		ebif_list_reverse_2 lists_reverse_2
bif lists:keymember/3
bif 'erl.lang.list.keylist':is_element/3 ebif_keylist_is_element_3 lists_keymember_3
bif lists:keysearch/3
bif 'erl.lang.list.keylist':search/3	ebif_keylist_search_3 lists_keysearch_3

lists:reverse/2 ってなに?

lists
reverse(List1, Tail) -> List2

Returns a list with the top level elements in List1 in reverse order, with the tail Tail appended. For example:

> lists:reverse([1, 2, 3, 4], [a, b, c]).
[4,3,2,1,a,b,c]
http://www.erlang.org/doc/man/lists.html

ふうむ、不思議な感じのする(なぜこれを独立したライブラリとしたのか分からない)関数だ。

一方、lists:reverse/1 の定義はこちら。

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

3 要素以上であれば、lists:reverse/2 に投げている。ということで、BIF が効いているということで納得。
# BIF の中身の C のコードはまだ理解できる気がしない :-