编写一个函数来找出所有不带歧义的函数名,也就是 那些只在一个模块里出现过的函数名(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', ...
随机推荐
- 【Kubernetes 系列四】Kubernetes 实战:管理 Hello World 集群
目录 1. 创建集群 1.1. 安装 kubectl 1.1.1. 安装 kubectl 到 Linux 1.1.2. 安装 kubectl 到 macOS 1.1.3. 安装 kubectl 到 W ...
- 以kaldi中的yesno为例谈谈transition
在基于GMM-HMM的传统语音识别里,比音素(phone)更小的单位是状态(state).一般每个音素由三个状态组成,特殊的是静音(SIL)由五个状态组成.这里所说的状态就是指HMM里的隐藏的状态,而 ...
- 使用Prerender.io进行网站预加载
我在自己的项目中是采用的前后端分离的技术,前端用的VUE开发,后端是JAVA开发,tomcat部署,nginx转发,但是VUE开发的项目缺点就是不利于SEO,所以针对SEO做了预加载的操作. 决定采用 ...
- Linux安装nfs共享文件
简介nfs nfs网络文件系统常用于共享音视频,图片等静态资源.将需要共享的资源放到NFS里的共享目录,通过服务器挂载实现访问. 服务端安装: yum install -y nfs-utils rpc ...
- 2321. 【NOIP普及组T1】方程
2321. [NOIP普及组T1]方程 时间限制: 1000 ms 空间限制: 262144 KB 题目描述
- opencv 视觉项目学习笔记(二): 基于 svm 和 knn 车牌识别
车牌识别的属于常见的 模式识别 ,其基本流程为下面三个步骤: 1) 分割: 检测并检测图像中感兴趣区域: 2)特征提取: 对字符图像集中的每个部分进行提取: 3)分类: 判断图像快是不是车牌或者 每个 ...
- spring-boot-plus后台快速开发脚手架之代码生成器使用(十)
spring-boot-plus 代码生成 Generator 代码生成内容 spring-boot-plus在mybatis-plus基础上,新增param/vo等模板 拓展controller/s ...
- 教你如何认识人脸识别开发套件中的双目摄像、3D结构光摄像头、单目摄像头的区别及详细讲解
深圳市宁远电子提供的人脸识别模组可支持双目摄像头和3D结构光摄像头,在客户咨询中经常有被问到双目的为什么会比单目的成本高,区别在哪里,他们的适用于哪些场景呢?在此,深圳市宁远电子技术工程师就为大家详细 ...
- centos6.8启动防火墙的艰辛过程
首先我的/etc/sysconfig/iptables文件没有. 解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptab ...
- C# 中的数据库操作~存储过程篇Mysql SqlServer
Mysql 存储过程查询方式 SQL server 普通数据库操作 EF 调用SQL SERVER存储过程 Mysql 存储过程查询方式: public NetPort GetNetdevicePor ...