編寫一個函數來找出全部不帶歧義的函數名,也就是 那些只在一個模塊裏出現過的函數名(erlang)

  erlang程序設計第八章練習題第二題:app

  code:all_loaded()命令會返回一個由{Mod,File}對構成的列表,內含全部Erlang系統函數

載入的模塊。使用內置函數Mod:module_info()瞭解這些模塊。編寫一些函數來找出哪一個模塊
導出的函數最多,以及哪一個函數名最多見。編寫一個函數來找出全部不帶歧義的函數名,也就是
那些只在一個模塊裏出現過的函數名。
spa

  這裏主要有三個問題:設計

  一、哪一個模塊導出的函數最多code

  二、哪一個函數名最多見blog

  三、哪些函數只在一個模塊出現get

  module_fun:find_most、find_pop、find_alone分別實現了上述問題.程序設計

  

  1 -module (module_fun).
  2 -export([find_most/0, find_pop/0, find_alone/0]).
  3 
  4 %%查找加載的模塊
  5 find_modules() ->
  6   [Module_Name || {Module_Name, _} <- code:all_loaded()].
  7 
  8 %%查找export最多的模塊
  9 find_most() ->
 10   find_most(find_modules())
 11   .
 12 find_most([]) -> {};
 13 find_most([H | T]) ->  find_most(T, {H,length(find_export(H))}).
 14 find_most([H | T], {_, Sum} = M) ->
 15   Sum1 = length(find_export(H)),
 16   if
 17     Sum1 > Sum ->  find_most(T, {H, Sum1});
 18     true -> find_most(T, M)
 19   end
 20 ;
 21 find_most([], M) -> M.
 22 
 23 %%查找哪一個函數最多見
 24 find_pop() ->
 25   Map = find_pop_map(find_all_export()),
 26   find_pop_max(Map)
 27 .
 28 
 29 find_pop_map([]) -> #{};
 30 find_pop_map([{Name, _} | T]) ->
 31   Map = find_pop_map(T),
 32   maps:put(Name,case maps:is_key(Name, Map) of
 33                   true -> maps:get(Name, Map);
 34                   false -> 0
 35                 end + 1, Map)
 36 .
 37 
 38 find_pop_max(Map) ->
 39   find_pop_max(maps:keys(Map), Map).
 40 
 41 find_pop_max([], _) -> {none, -1};
 42 find_pop_max([H | T], Map) ->
 43   Count = maps:get(H, Map),
 44   Max = {_, Count1} = find_pop_max(T, Map),
 45   if
 46     Count > Count1 -> {H, Count};
 47     true -> Max
 48   end.
 49 
 50 
 51 %%查找只在一個模塊裏出現的函數
 52 find_alone() ->
 53   Module_Names = find_modules(),
 54   L = [ {F, Module_Name} || Module_Name <- Module_Names, F <- find_fun_name(Module_Name)],
 55   find_alone(L, L)
 56 .
 57 
 58 find_alone_ex(_, []) -> false;
 59 find_alone_ex({Name, M} = P, [{Name1, M1} | T] ) ->
 60   if
 61     M =:= M1 -> find_alone_ex(P, T);
 62     Name =:= Name1 -> true;
 63     true -> find_alone_ex(P, T)
 64   end
 65 .
 66 
 67 find_alone([], _) -> #{};
 68 find_alone([{Name, M} = H | T], L) ->
 69   Map = find_alone(T, L),
 70   case find_alone_ex(H, L) of
 71       true -> Map;
 72       false ->
 73         Array = case maps:is_key(M, Map) of
 74            true -> maps:get(M, Map);
 75            false -> []
 76         end,
 77         maps:put(M, [Name | Array], Map)
 78   end.
 79 
 80 
 81 
 82 find_all_export() ->
 83   Module_Names = find_modules(),
 84   [ F || Module_Name <- Module_Names, F <- find_export(Module_Name)].
 85 
 86 
 87 %%模塊export的函數
 88 find_export(Module_Name) ->
 89   [{Fun_Name, Fun_Int} ||
 90     {exports, Fun_Arr} <- apply(Module_Name, module_info, [])
 91     , {Fun_Name, Fun_Int} <- Fun_Arr
 92     , Fun_Name =/= module_info
 93   ].
 94 
 95 find_fun_name(Module_Name) ->
 96   filter_fun(find_export(Module_Name)).
 97 
 98 filter_fun([]) ->
 99   [];
100 filter_fun([{Name, _} | T]) ->
101   [Name | filter_fun(lists:filter(fun({Name1, _}) -> Name =/= Name1 end, T))]
102 .
相關文章
相關標籤/搜索