热门标签 | 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



推荐阅读
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 如何使用 `org.opencb.opencga.core.results.VariantQueryResult.getSource()` 方法及其代码示例详解 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 本文介绍了在 Java 编程中遇到的一个常见错误:对象无法转换为 long 类型,并提供了详细的解决方案。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
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社区 版权所有