编写一个函数来找出所有不带歧义的函数名,也就是 那些只在一个模块里出现过的函数名(erlang)
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)的更多相关文章
- 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列
问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit ...
- hdu1298 T9(手机输入法,每按一个数字,找出出现频率最高的字串,字典树+DFS)
Problem Description A while ago it was quite cumbersome to create a message for the Short Message Se ...
- python的自省函数, 快速找出BUG的良器
python内置的好多自省函数, 合理使用可快速查找相关提示, 快速找到问题点, 以下开始具体说明 1. dir() 列出对象的所有属性和方法 如: dir(list) 可以列出列表的所有属性 ...
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9
python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...
- 编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad。
package IO; import java.io.*; public class FileCopy { public static void main(String[] args) throws ...
- 算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题
今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀 ...
- 找出二叉查找树中指定结点的”下一个"结点(也即中序后继)
设计一个算法.找出二叉查找树中指定结点的"下一个"结点(也即中序后继).能够假定每一个结点都含有指向父结点的连接. watermark/2/text/aHR0cDovL2Jsb2c ...
- [leetcode] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素
题目大意 https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/ 230. Kth Smallest Elem ...
- 【python cookbook】找出序列中出现次数最多的元素
问题 <Python Cookbook>中有这么一个问题,给定一个序列,找出该序列出现次数最多的元素.例如: words = [ 'look', 'into', 'my', 'eyes', ...
随机推荐
- Unity实现放大缩小以及相机位置平移实现拖拽效果
放大缩小功能是游戏开发中用到的功能,今天就来讲一下Unity中放大缩小怎么实现. 1.IDragHandler, IBeginDragHandler, IEndDragHandler这三个接口是Uni ...
- jq css3实现跑马灯+大转盘
前端效果, <!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" con ...
- Tomcat源码分析 (四)----- Pipeline和Valve
在 Tomcat源码分析 (二)----- Tomcat整体架构及组件 中我们简单分析了一下Pipeline和Valve,并给出了整体的结构图.而这一节,我们将详细分析Tomcat里面的源码. Val ...
- 重学计算机组成原理(七)- 程序无法同时在Linux和Windows下运行?
既然程序最终都被变成了一条条机器码去执行,那为什么同一个程序,在同一台计算机上,在Linux下可以运行,而在Windows下却不行呢? 反过来,Windows上的程序在Linux上也是一样不能执行的 ...
- (七)c#Winform自定义控件-进度条
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- HTTP与HTTPS之面试必备
本文主要讲解Http与https的区别,以及https是怎样加密来保证安全的. 首先讲这俩个协议的简单区别: HTTP:超文本传输协议. HTTPS:安全套接字层超文本传输协议HTTP+SSL HTT ...
- Java网络编程与NIO详解2:JAVA NIO 一步步构建I/O多路复用的请求模型
微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot.SSM全家桶.MySQL.分布式.中间件.微服务,同时也懂点投资理财,坚持学习和写作,相信终身 ...
- 线程学习oneday
进程:执行中的程序叫做进程(Process),是一个动态的概念. 线程:一个进程可以产生多个线程.同多个进程可以共享操作系统的某些资源一样,同一进程的多个线程也可以共享此进程的某些资源(比如:代码.数 ...
- 记录一则clear重做日志文件的案例
1.官方文档描述 2.故障报错信息 3.分析解决问题 1.官方文档描述 关于Clearing a Redo Log File的官方文档描述: A redo log file might become ...
- 基于 Javassist 和 Javaagent 实现动态切面
一.背景介绍 1.需求说明 需求是在程序运行期间,向某个类的某个方法前.后加入某段业务代码,或者直接替换整个方法的业务逻辑,即业务方法客制化.注意是运行期间动态更改,做到无侵入,而不是事先在代码中写死 ...