狐的传说
Erlang中删除列表元素在标准模块lists中可以找到delete/2函数,比如调用lists:delete(2, [1,2,3,4,5])后将返回新的列表[1,3,4,5]笔者在翻阅lists模块源码中发现,一些函数实现成BIF,比如reverse就是一个BIF,在注释中发现%% reverse(L) reverse all elements in the list L. Is now a BIF!由此确定reverse是一个BIF。但对delete函数的实现没找到类似的注释,怀疑其不是一个BIF,其实现存在性能问题,其实现代码如下:delete(Item, [Item|Rest]) -> Rest;delete(Item, [H|Rest]) ->[H|delete(Item, Rest)];delete(_, []) -> [].这个实现没使用尾递归,对大表的操作将会导致堆栈上的内存消耗严重。测试程序如下:test1() ->{ok,Bin} = file:read_file("file1.txt"),L = binary_to_list(Bin),R = lists:delete($a,L),io:format("~p~n",[length(R)]).