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. Powered by .NET Core 进展:用 docker-compose 验证高并发问题嫌疑犯 docker swarm

    相关博文: [故障公告]发布 .NET Core 版博客站点引起大量 500 错误 [网站公告].NET Core 版博客站点第二次发布尝试 暴风雨中的 online : .NET Core 版博客站 ...

  2. resolv.conf文件配置相关的案例

    引言 操作系统中/etc/resolv.conf配置文件中的内容一般为空,如果该文件配置不正确,将导致ssh.route.netstat命令响应慢的问题. 在/etc/resolv.conf添加错误地 ...

  3. 基于RBAC的权限框架

    RBAC权限框架(Role-Based Access Control)基于角色的权限访问控制的框架,通过用户-角色-权限的关联,非常方便的进行权限管理,在这里不再说明什么是RBAC,请自行百度. 谢谢 ...

  4. Linux--shell编程原理--03

    一.编程原理: 1.编程介绍: 计算机只能识别二进制指令 程序=指令+数据 根据服务的重心不同,我们分为面向过程编程,面向对象编程: a) 面向过程:侧重于指令的编程语言 b) 面向对象:侧重于数据的 ...

  5. intellij idea与github整合管理代码

    各位看官大家好,博主每每在公司学习新知识写代码时都需要通过U盘带回家来继续每天的学习,觉得这样实在麻烦,于是今天就整合了一下github来完成代码的管理. 开始之前我们需要准备三样东西:1.intel ...

  6. map的实现和柯里化(Currying)

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/11329874.html 作者:窗户 ...

  7. Java一个简单的文件工具集

    class FileUtils { //文件目录下文件总数目 public static int fileNumber(File dir) { int filenumber = 0; if(dir.e ...

  8. hadoop2.7作业提交详解之文件分片

    在前面一篇文章中(hadoop2.7之作业提交详解(上))中涉及到文件的分片. JobSubmitter.submitJobInternal方法中调用了int maps = writeSplits(j ...

  9. Apache 配置 https

    本人当前的Apache版本是: ​ 由于我是yum安装的http,默认的http配置文件我就不多说了, 下面开始记录一下自己的线上配置过程: 1,进入/etc/httpd/conf.d目录,新建证书放 ...

  10. Python爬虫(二)正则表达式

    一.介绍 1.概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来 ...