热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

erlang程序设计第八章练习题第二题:code:all_loaded()命令会返回一个由{Mod,File}对构成的列表,内含所有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} &#61; M) ->
15 Sum1 &#61; 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 &#61; 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 &#61; 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 &#43; 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 &#61; maps:get(H, Map),
44 Max &#61; {_, Count1} &#61; 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 &#61; find_modules(),
54 L &#61; [ {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} &#61; P, [{Name1, M1} | T] ) ->
60 if
61 M &#61;:&#61; M1 -> find_alone_ex(P, T);
62 Name &#61;:&#61; Name1 -> true;
63 true -> find_alone_ex(P, T)
64 end
65 .
66
67 find_alone([], _) -> #{};
68 find_alone([{Name, M} &#61; H | T], L) ->
69 Map &#61; find_alone(T, L),
70 case find_alone_ex(H, L) of
71 true -> Map;
72 false ->
73 Array &#61; 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 &#61; 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 &#61;/&#61; 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 &#61;/&#61; Name1 end, T))]
102 .

 

 

转:https://www.cnblogs.com/zhouquan-1992-04-06/p/10830693.html



推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
author-avatar
大爱小哇先森_991
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有