编写一个函数来找出所有不带歧义的函数名,也就是 那些只在一个模块里出现过的函数名(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', ...
随机推荐
- FTP工具-FileZilla安装使用教程
1.首先,百度搜索“FileZilla”,进入官网,下载地址:https://www.filezilla.cn/download/client ,根据自己电脑配置去下载 2.下载本地,双击运行安装程 ...
- 08_代码块丶继承和final
Day07笔记 课程内容 1.封装 2.静态 3.工具类 4.Arrays工具类 封装 概述 1.封装:隐藏事物的属性和实现细节,对外提供公共的访问方式 2.封装的好处: 隐藏了事物的实现细节 提高了 ...
- Spring系列(二):Spring IoC应用
一.Spring IoC的核心概念 IoC(Inversion of Control 控制反转),详细的概念见Spring系列(一):Spring核心概念 二.Spring IoC的应用 1.定义B ...
- 安装yarn实况
[**前情提要**]最近在gayhub上面得到一个开源项目,遂准备研究一下源码,当然第一步就是要把项目运行起来.然后看了一下技术栈,发现包管理工具是使用yarn,以前也听说过yarn但是也没有具体使用 ...
- android ——后台下载
这次的这个demo想要实现一个后台下载文件的功能,下载的时候会有一个告知进度的通知, 使用的依赖库就一个: compile 'com.squareup.okhttp3:okhttp:3.9.0' 大体 ...
- Window.open使用总结
前言 今天在项目中,突然看到window.open的使用,感觉还是很神奇,突然心血来潮查看了window.open的用法. 用途 主要用于在打开网站时弹出的其他窗口.用于通知广告一类的. 用法 win ...
- 记录一次Git解决CONFLICT冲突
目录 记录一次Git解决CONFLICT冲突 1.CONFLICT产生的原因 2.Git正确的LIANGZHONG 使用流程 2.1 暂存,拉取,恢复暂存,合并(如果有冲突),提交,推送 2.2 将本 ...
- Flink 源码解析 —— Standalone session 模式启动流程
Standalone session 模式启动流程 https://t.zsxq.com/EemAEIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0 ...
- Gitment评论插件的使用
前言 继上一篇的 GitPages部署自己的网站 现在开始添加博客的评论插件Gitment.这里的话我是使用hexo添加gitment插件,如果不是使用hexo,请到官网指定这里. 开始 第一步 注册 ...
- 打包Electron项目
先确保该项目正常运行npm run dev,结束程序, 上篇的项目运行已经提到了打包输出工具electron-packager 可以使用全局安装的方式: npm install -g electron ...