《Erlang 程序设计》练习答案 -- 第八章 顺序编程补遗

% (1).复习这一张关于Mod:module_info()的部分。输入命令dict:module_info()。这个模块返回了多少函数?

这里写图片描述


% (2).code:all_loaded() 命令会返回一个由{Mod, File}对构成的列表,
% 内含所有Erlang系统载入的模块。编写一些函数来找出
% 哪个模块导出的函数最多?
% 哪个函数名最常见。
% 不带歧义的函数名(只出现过一次)。

-module(getInfo).
-export([get_info/0, list_size/1, count_function/2, find_max/1, find_one/1, for/4]).


list_size(L) ->
    list_size(L, 0).

list_size([H|T], Size) ->
    list_size(T, Size+1);
list_size([], Size) ->
    Size.

% 找出哪个模块导出的函数最多
%get_info() ->
%    Info = code:all_loaded(),
%    get_info(Info, -1).
%
%get_info([H|T], Max) ->
%    {Name, _} = H,
%    [_, {exports, L}, _, _, _] = Name:module_info(),
%    case (list_size(L) >= Max) of
%        true -> get_info(T, list_size(L));
%        false -> get_info(T, Max)
%    end;
%get_info([], Max) ->
%    Max.

% 哪个函数名最常见
get_info() ->
    Info = code:all_loaded(),
    get_info(Info, #{}).

get_info([H|T], X) ->
    {Name, _} = H,
    [_, {exports, L}, _, _, _] = Name:module_info(),
    get_info(T, count_function(L, X));
get_info([], X) ->
    %X.
    %问题2,找出出现次数最多的
    %find_max(X).
    %问题3,找出出现一次的
    %find_one(X).

count_function([H|T], X) ->
    {FuncName, _} = H,
    case maps:is_key(FuncName, X) of
        false -> count_function(T, X#{FuncName => 1});
        true  -> #{FuncName := Count} = X,
                count_function(T, X#{FuncName := Count+1})
    end;
count_function([], X) ->
    X.

% 问题2 找出出现次数最多的
find_max(X) ->
    L = maps:keys(X),
    for(L, X, "", -1).


% 问题3 找出只在模块中出现过一次的函数。
find_one(X) ->
    L = maps:keys(X),
    lists:filter(fun(E) -> {ok, Value} = maps:find(E, X),
                           Value == 1 end, L).

for([H|T], X, MaxKey, MaxValue) ->
    {ok, Value} = maps:find(H, X),
    case (Value > MaxValue) of
        true  -> for(T, X, H, Value);
        false -> for(T, X, MaxKey, MaxValue)
    end;
for([], X, MaxKey, MaxValue) ->
    {MaxKey, MaxValue}.


导出最多的函数
这里写图片描述
最多导出 324 个函数

最常见的函数名
这里写图片描述

只出现过一次的函数名
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值