bif 一覧
同じく、 cooldaemon さんの結果で、
lists モジュール、自前の関数、リスト内包表記の速度比較 - cooldaemonの備忘録
検証コードを繰り返し実行した所、lists:reverse/1 の方が、自前の関数より早い事の方が多かった。
というものがある。これも根っこがきになる。
まずは、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) -> List2Returns 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 のコードはまだ理解できる気がしない :-