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

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

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

  这里主要有三个问题:

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

  2、哪个函数名最常见

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

  module_fun:find_most、find_pop、find_alone分别实现了上述问题.

  

 -module (module_fun).
-export([find_most/0, find_pop/0, find_alone/0]). %%查找加载的模块
find_modules() ->
[Module_Name || {Module_Name, _} <- code:all_loaded()]. %%查找export最多的模块
find_most() ->
find_most(find_modules())
.
find_most([]) -> {};
find_most([H | T]) -> find_most(T, {H,length(find_export(H))}).
find_most([H | T], {_, Sum} = M) ->
Sum1 = length(find_export(H)),
if
Sum1 > Sum -> find_most(T, {H, Sum1});
true -> find_most(T, M)
end
;
find_most([], M) -> M. %%查找哪个函数最常见
find_pop() ->
Map = find_pop_map(find_all_export()),
find_pop_max(Map)
. find_pop_map([]) -> #{};
find_pop_map([{Name, _} | T]) ->
Map = find_pop_map(T),
maps:put(Name,case maps:is_key(Name, Map) of
true -> maps:get(Name, Map);
false -> 0
end + 1, Map)
. find_pop_max(Map) ->
find_pop_max(maps:keys(Map), Map). find_pop_max([], _) -> {none, -1};
find_pop_max([H | T], Map) ->
Count = maps:get(H, Map),
Max = {_, Count1} = find_pop_max(T, Map),
if
Count > Count1 -> {H, Count};
true -> Max
end. %%查找只在一个模块里出现的函数
find_alone() ->
Module_Names = find_modules(),
L = [ {F, Module_Name} || Module_Name <- Module_Names, F <- find_fun_name(Module_Name)],
find_alone(L, L)
. find_alone_ex(_, []) -> false;
find_alone_ex({Name, M} = P, [{Name1, M1} | T] ) ->
if
M =:= M1 -> find_alone_ex(P, T);
Name =:= Name1 -> true;
true -> find_alone_ex(P, T)
end
. find_alone([], _) -> #{};
find_alone([{Name, M} = H | T], L) ->
Map = find_alone(T, L),
case find_alone_ex(H, L) of
true -> Map;
false ->
Array = case maps:is_key(M, Map) of
true -> maps:get(M, Map);
false -> []
end,
maps:put(M, [Name | Array], Map)
end. find_all_export() ->
Module_Names = find_modules(),
[ F || Module_Name <- Module_Names, F <- find_export(Module_Name)]. %%模块export的函数
find_export(Module_Name) ->
[{Fun_Name, Fun_Int} ||
{exports, Fun_Arr} <- apply(Module_Name, module_info, [])
, {Fun_Name, Fun_Int} <- Fun_Arr
, Fun_Name =/= module_info
]. find_fun_name(Module_Name) ->
filter_fun(find_export(Module_Name)). filter_fun([]) ->
[];
filter_fun([{Name, _} | T]) ->
[Name | filter_fun(lists:filter(fun({Name1, _}) -> Name =/= Name1 end, T))]
.

 

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

  1. 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列

    问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit ...

  2. hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)

    Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...

  3. python的自省函数, 快速找出BUG的良器

    python内置的好多自省函数,  合理使用可快速查找相关提示, 快速找到问题点, 以下开始具体说明 1. dir()  列出对象的所有属性和方法 如:  dir(list)  可以列出列表的所有属性 ...

  4. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9

    python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...

  5. 编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad。

    package IO; import java.io.*; public class FileCopy { public static void main(String[] args) throws ...

  6. 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

    今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...

  7. 找出二叉查找树中指定结点的”下一个&quot;结点(也即中序后继)

    设计一个算法.找出二叉查找树中指定结点的"下一个"结点(也即中序后继).能够假定每一个结点都含有指向父结点的连接. watermark/2/text/aHR0cDovL2Jsb2c ...

  8. [leetcode] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素

    题目大意 https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/ 230. Kth Smallest Elem ...

  9. 【python cookbook】找出序列中出现次数最多的元素

    问题 <Python Cookbook>中有这么一个问题,给定一个序列,找出该序列出现次数最多的元素.例如: words = [ 'look', 'into', 'my', 'eyes', ...

随机推荐

  1. 富文本编辑器TinyMCE的使用(React Vue)

    富文本编辑器TinyMCE的使用(React Vue) 一,需求与介绍 1.1,需求 编辑新闻等富有个性化的文本 1.2,介绍 TinyMCE是一款易用.且功能强大的所见即所得的富文本编辑器. Tin ...

  2. 【Java例题】7.2 线程题2-随机数求和线程

    2.随机数求和线程.设计一个线程子类,产生10000个随机数,并求和,显示和的结果:然后编写主类,在主函数中定义一个线程对象,并启动这个线程. package chapter7; public cla ...

  3. java支付宝app支付-代码实现

    1.我们需要在支付宝商户平台配置好,取到四个参数如下(这是支付宝官方配置地址):https://www.cnblogs.com/fuzongle/p/10217144.html 合作身份者ID:123 ...

  4. Python中input()的使用方法

    input()以字符串的方式获取用户输入: >>> x = input() 4.5 >>> type(x) <class 'str'> >> ...

  5. 前端登录jq图形验证码

    <!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8" ...

  6. (十五)c#Winform自定义控件-键盘(二)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. 合并多个jar包,并通过私服依赖

    背景:许多jar包在maven仓库中没有,项目如果添加了许多的本地jar包,别人拿到代码也无法编译 需求:将本地jar包上传至私服并设置依赖,如果jar包较多,但都从属于同一功能,需要合并为一个jar ...

  8. mysql------explain工具

    基于mysql5.7,innodb存储引擎 使用explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL ...

  9. Git安装与使用(windows环境)(一)----Git安装、生成公钥和私钥、添加SSH

    安装 1.从官网下载git:http://git-scm.com/downloads 2.安装git,选择git组件安装,如下图 3.一直next,直到出现下面的窗口.这里是选择命令行形式.(可以理解 ...

  10. IIS配置后本地访问正常,但外网无法访问

    很久没有部署IIS网站项目了,都有些手生了,这不今天就遇到了问题.首先确定的是,我的网站配置没有问题,因为内网访问正常.内网访问情况如下: 但是外网访问时确是这样的: 怎么回事儿呢?我就想是不是防火墙 ...