
Erlang
文章平均质量分 62
夏天的技术博客
这个作者很懒,什么都没留下…
展开
-
Erlang map 中的非法匹配问题
《Programming Erlang》第 5 章有个例子。 通过 map 计算字符串各个字符出现的频率。代码如下-module(countChar).-export([count_characters/1]).count_characters(Str) -> count_characters(Str, #{}).count_characters([H|T], #{ H => N }原创 2015-11-09 20:20:53 · 1568 阅读 · 2 评论 -
Erlang 构建多层监督机制
今天在写项目时需要用到 Erlang 的多层监督机制,写过程中遇到点问题,再此记录下来,也希望对正在学习 Erlang 的小伙伴有帮助。Erlang 支持多重监督机制。otp design 上面有详细的介绍。大致样子如下图:途中方块表示督程(supervisor),圆圈表示拥程(worker)。本篇文章将从头到尾建立一个上图所示的机制。开始我们先用 rebar 简单的建立个项目rebar creat原创 2015-12-17 03:08:15 · 1204 阅读 · 0 评论 -
Erlang OTP源码分析 – gen_server
博客原链接 非常感谢作者的博文:)阅读OTP源码可以帮助你写出更好、更健壮的erlang程序.下面一系列文章就gen_server、gen_fsm、supervisor的源码进行分析, 从erlang级别解释其工作原理, 所有的完整流程图在这里, 第一次写erlang方面博文有错误请帮忙指出.为什么从gen_server它开始, 因为gen_fsm和它很类似, 而supervsisor本身是一个g转载 2015-11-26 11:20:26 · 1968 阅读 · 0 评论 -
《Erlang 程序设计》练习答案 -- 第十三章 并发程序中的错误
% (1).编写一个 my_spawn(Mod, Func, Args) 函数。它的行为类似 spawn(Mod, Func, Args),% 但有一点区别。如果分裂出的进程挂了,就应打印出一个消息,说明进程挂掉的原因以及% 在此之前存货了多长时间。-module(myspawn).-export([my_spawn/3]).-spec my_spawn(Mod, Func, Args) ->原创 2015-11-18 00:59:42 · 1227 阅读 · 2 评论 -
Erlang 中的并发 -- Actor 模型
首先,我们聊聊现实世界中的并发。我曾经举过一个并发和并行的例子: 老妈在很短的时间给我安排了很多任务,吃包子,拖地,洗碗…等等 由于我母亲大人比较严厉,所以我“愉快”地接受了所有任务。 这就是所谓的并发,在某一时段,能接受的事件。 我只有两只手,可以用一只手来吃包子,另一只手来拖地。 这就是所谓的并行,在某一时刻,能处理的事件。现实世界中,并发的事情无处不在,就拿上面的原创 2015-11-11 04:42:19 · 7047 阅读 · 0 评论 -
阅读 Erlang lib_chan 源码
lib_chan 是《Programming Erlang》 作者写的一种构建分布式系统的组件,思想很值得学习。 刚开始学习 Erlang,感觉编写代码的风格不是很适应,但感觉思想非常 nice。 看到书的中间部分用到了它,不想用的不明不白,所以打算阅读下,并做了简单地注释。若有错误还望指正。我的一点看法:我们如果要使用 lib_chan 构建一个分布式系统非常简单,只需要写上服务器的功能代码即原创 2015-11-19 22:42:29 · 2034 阅读 · 0 评论 -
Erlang并发机制 –进程调度
转自 这里Erlang调度器主要完成对Erlang进程的调度,它是Erlang实现软件实时和进程之间公平使用CPU的关键。Erlang运行时,有4种任务需要被调度:进程,Port,Linked-in driver,Erlang虚拟机的系统级活动。Erlang调度器主要有以下特点: 1. 进程调度运行在用户空间 :Erlang进程不同于操作系统进程,Erlang的进程调度也跟操作系统完全没有关系,是转载 2015-11-23 15:28:09 · 2190 阅读 · 0 评论 -
《Erlang 程序设计》练习答案 -- 第十二章 并发编程
% (1).编写一个start(AnAtom, Fun)函数来把spawn(Fun)注册为AnAtom。% 确保当两个并行的进程同时执行start/2时你的程序也能正确工作。% 在这种情况下,必须保证其中一个进程会成功执行而另一个会失败。-module(execstart).-export([create/2]).start(AnAtom, Fun) -> case whereis(原创 2015-11-17 13:33:59 · 2605 阅读 · 7 评论 -
《Erlang 程序设计》练习答案 -- 第九章 类型
% (1).编写一些导出单个函数的小模块,以及被导出函数的类型规范。% 在函数里制造一些类型错误,然后对这些程序运行 dialyzer 并试着理解错误消息。% 有时候你制造的错误无法被 dialyzer 发现,请仔细观察程序,找出没有得到预期错误的原因。-module(minmodule).-export([func1/3]).-spec func1(number(), number(), n原创 2015-11-16 22:00:29 · 961 阅读 · 1 评论 -
《Erlang 程序设计》练习答案 -- 第八章 顺序编程补遗
% (1).复习这一张关于Mod:module_info()的部分。输入命令dict:module_info()。这个模块返回了多少函数?% (2).code:all_loaded() 命令会返回一个由{Mod, File}对构成的列表,% 内含所有Erlang系统载入的模块。编写一些函数来找出% 哪个模块导出的函数最多?% 哪个函数名最常见。% 不带歧义的函数名(只出现过一次)。-modu原创 2015-11-16 15:58:25 · 1157 阅读 · 0 评论 -
《Erlang 程序设计》练习答案 -- 第六章 顺序程序的错误处理
% (1).file:read_file(File) 会返回 {ok, Bin} 或者 {error, Why},% 其中 File 是文件名, Bin 则包含了文件的内容。请编写一个% myfile:read(File) 函数,当文件可读取时返回 Bin,否则抛出% 一个异常。-module(myfile).-export([read/1]).read(File) -> try原创 2015-11-14 22:23:10 · 1176 阅读 · 2 评论 -
《Erlang 程序设计》练习答案 -- 第五章 记录与映射组
% (1).配置文件可以很方便地用 JSON 数据表示。% 请编写一些函数来读取包含 JSON 数据的配置文件,% 并将它们转换成 Erlang 的映射组。% 再编写一些代码,对配置文件里的数据进行合理性检查。注意:Erlang 并没有自带 Json 序列化函数 老爷子写的书上明明有,你说没有?戳 这里 这点也坑了我一下。不过 StackOverFlow 答主给我们列出了两个 Erlang原创 2015-11-14 12:19:11 · 1848 阅读 · 3 评论 -
《Erlang 程序设计》练习答案 -- 第四章 模块与函数
% (1).扩展 geometry.erl 添加一些子句来计算圆和直角三角形的面积。% 添加一些子句来计算各种几何图形的周长-module(geometry).-export([area/1]).area({rectangle, Width, Height}) -> Width * Height;area({square, Side}) -> Side * Side;% 计算原创 2015-11-12 19:37:11 · 1823 阅读 · 2 评论 -
《Erlang 程序设计》练习答案 -- 第三章 基本概念
% (1).快速浏览 3.13 节,然后测试并记忆这些行编辑命令在 Erlang shell 中输入Ctrl + A 行首Ctrl + D 删除当前字符Ctrl + E 行尾Ctrl + F或右箭头 向前的字符(类似跨越一个单词)Ctrl + B或左箭头 向后的字符Ctrl + P或上箭头 前一行Ctrl + N或下箭头 下一行Ctrl + T 调换最近两个字符的位置原创 2015-11-12 15:06:15 · 992 阅读 · 0 评论 -
《Erlang 程序设计》练习答案 -- 第二章 Erlang 速览
Erlang 资料本来就非常少,我在网上和 git 都没有找到本书答案,所以打算自己写出来。 一来希望能帮到初学的朋友。 二来若答案有问题,望大家能提出来,共同进步^_^git 地址 ProgrammingErlangAnswer第一章 什么是并发 没有练习题。第二章 Erlang 速览% (1).启动并停止 Erlang在终端输入 erl 启动 Erlang shell在终端输入原创 2015-11-12 14:39:52 · 1946 阅读 · 1 评论 -
《Erlang 程序设计》练习答案 -- 第七章 二进制型与位语法
% 编写一个函数来反转某个二进制型里的字节顺序-module(reverse_byte).-export([reverse_byte/1]).% 注释为将对象先转化为二进制,然后进行反转。%reverse_byte(Obj) ->% reverse_byte(term_to_binary(Obj), <<>>,1).reverse_byte(Bin) -> reverse_byt原创 2015-11-16 14:11:15 · 1563 阅读 · 11 评论