• 编写一个函数来找出所有不带歧义的函数名,也就是 那些只在一个模块里出现过的函数名(erlang)


      erlang程序设计第八章练习题第二题:

      code:all_loaded()命令会返回一个由{Mod,File}对构成的列表,内含所有Erlang系统

    载入的模块。使用内置函数Mod:module_info()了解这些模块。编写一些函数来找出哪个模块
    导出的函数最多,以及哪个函数名最常见。编写一个函数来找出所有不带歧义的函数名,也就是
    那些只在一个模块里出现过的函数名。

      这里主要有三个问题:

      1、哪个模块导出的函数最多

      2、哪个函数名最常见

      3、哪些函数只在一个模块出现

      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 .

     

  • 相关阅读:
    vs 2005 使用 UpdatePanel 配置
    gridview checkbox 列
    csv 格式文件 导入导出
    UML中数据流图,用例图,类图,对象图,角色图,活动图,序列图详细讲述保存供参考
    c# 根据经纬度 求两点之间的距离
    c# 加密汇总
    日期获取 第一天,最后一天
    求点到直线的垂足
    c# 修改注册表
    HDOJ_1548 上楼梯 DJ
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/10830693.html
Copyright © 2020-2023  润新知