首页 > 代码库 > Erlang 101 Erlang环境和顺序编程 - should done in 2014-10-26
Erlang 101 Erlang环境和顺序编程 - should done in 2014-10-26
笔记系列
Erlang环境和顺序编程
Erlang并发编程
Erlang分布式编程
Yaws
Erlang/OTP
前言
拖了很久很久了,终于快忘的差不多了。
Agenda
0 范围
环境
Erlang运行时环境、Emacs开发环境
顺序编程
数据结构
语法
1 Erlang环境搭建
Erlang website
http://www.erlang.org/
实践版本
otp_win32_R16B/erl5.10.1
安装路径记为ERLANG_HOME=D:/erl5.10.1
获取环境变量的方法见杂项一节。
Javaer Eclipse
Erlang plugin (ErlIDE) for Eclipse
http://erlide.org/index.html
Emacs开发环境
Emacs版本: GNU emacs-24.3
完整的Emacs的Erlang模式设置见:
http://www.erlang.org/doc/apps/tools/erlang_mode_chapter.html
A sample:
;; erlang (setq load-path (cons "D:/erl5.10.1/lib/tools-2.6.10/emacs" load-path)) (setq erlang-root-dir "D:/erl5.10.1/lib/tools-2.6.10") (setq exec-path (cons "D:/erl5.10.1/lib/tools-2.6.10/bin" exec-path)) (require ‘erlang-start) |
自动补全hint
http://stackoverflow.com/questions/3762583/emacs-textmate-code-completion-for-erlang
http://www.erlang.org/doc/man/erlang.el.html
离线文档
文档路径记为DOC_ROOT=D:/erl5.10.1/doc
应用索引页: DOC_ROOT/applications.html
模块索引页(OTP Reference Page Index): DOC_ROOT/doc/man_index.html
Erlang Quick Reference Card:https://github.com/stolowski/Erlang-Quick-Reference-Card/blob/master/erlang-quickref.pdf
2 Erlang顺序编程
2.1 数据结构
变量
Erlang的变量词法上以大写字母开头。
Erlang变量不会变,或者称为一次性赋值变量。
赋予了值的变量称为绑定变量,否则称为未绑定变量。
LHS = RHS.
=是一次模式匹配操作,先计算RHS的值,将结果与LHS的模式项匹配。
与C系列命令式语言中可变变量所带来的错综复杂的副作用相比,一次性变量极大的方便了错误定位。
作用域
变量的作用域是它定义时所处的语汇单元。
没有一个函数的不同子句共享全局或私有变量这种说法。
“全局变量”
每个Erlang进程中有一个称为进程字典的私有数据存储区域,进程字典是一个关联数组,等价于map、hashmap或散列表。
引用(reference)是全局唯一的Erlang数据类型,用于创建唯一的标签;用BIF erlang:make_ref()创建。
Erlang的原子。
匿名变量、下划线变量
匿名变量词法用下划线_表示,告知编译器这是一个无关紧要的变量,不用于绑定。同一模式中多个_不必绑定相同的值。
下划线变量_VarName,是常规变量,用于屏蔽在子句中仅使用了一次的变量所产生的编译器警告。
数值
整数
Erlang可以用任意长度的整数执行整数运算,只受限于可用的内存。
表示法:
(1)传统写法
(2)K进制整数:K#Digits,最高的进制数是36;
(3)$写法:$C表示ASCII字符C的整数代码。
浮点数
词法:[+|-] 整数部分 . 分数部分 [指数部分]
指数部分::= (e|E) (+|-) 整数
Erlang内部使用IEEE 754的64位格式表示浮点数。
原子
Erlang的原子表示常量值,词法上以小写字母开头,后接字母、数字、_或@,或者放在单引号(‘)内,单引号内可以放置任意符号。
双引号(“)与单引号不可互用。
Erlang原子是全局性的,不需要宏定义或包含文件就能实现。
元组
Erlang的元组(tuple)词法:{term1, term2, …}
带标签的元组:{label, term1, term2, …}
列表
Erlang的列表(list)词法:[term1, term2, …]
如果T是一个列表,则[H | T]也是列表,它的头部是H,尾部是T。[]是空列表。
格式正确的列表:用[… | T]创建的列表,且T是列表。
字符串
Erlang字符串是一个整数列表或一个二进制型,其中整数列表中元素表示一个Unicode码点。
字符串字面量:用””包含的字符序列。
记录和映射组
二进制型
2.2 程序结构
Erlang程序往往由几个模块构成,每个模块包含按逻辑组合在一起的函数。
模块
模块顶部有一些-attribute(Value)构成的属性列表,它们通常放在模块的开始。
可以编写自定义的模块属性,但只能有一个参数。
A sample:temp.erl
Emacs中Erlang -> Skeletons -> gen_server生成的代码片段(gen_server是一个OTP行为模式,后面记录OTP的文章中会涉及)
-module(temp).? 模块声明,声明中模块名必须与模块文件名相同
-behaviour(gen_server).
%% API -export([start_link/0]). ? 导出声明
%% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-define(SERVER, ?MODULE). ? 宏声明
-record(state, {}). ? 记录声明
%%%=================================================================== %%% API %%%=================================================================== start_link() -> ? 函数定义 gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%%=================================================================== %%% gen_server callbacks %%%===================================================================
init([]) -> {ok, #state{}}.
handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}.
handle_cast(_Msg, State) -> {noreply, State}.
handle_info(_Info, State) -> {noreply, State}.
terminate(_Reason, _State) -> ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.
%%%=================================================================== %%% Internal functions %%%===================================================================
|
函数
A meaningful sample
-module(geometry).
-export([area/1]).
area({rectangle, Width, Height}) -> Width * Height; area({square, Side}) -> Side * Side. |
编译和运行
2.3 语法
操作符
分支
错误处理
杂项
2.4 终结者
EDoc
dialyzer
EUnit
crashdump_viewer
dbg
垃圾收集
5 杂项
获取环境
(erts-5.10.1应用中的init)
> init:get_argument(root). %Erlang/OTP的安装目录
> init:get_argument(progname). %启动Erlang的程序名称
> init:get_argument(home). %用户系统中主目录
USER_HOME = C:/Users/lenovo
> init:get_arguments(). %所有参数
.erlang文件
REF DOC_ROOT/erts-5.10.1/doc/html/erl.html section Configuration
查看加载模块
> code:get_path().
Sample:
节点连通/Cookie
.erlang.cookie在USER_HOME目录下。
> net_adm:ping(<Node>).
> auth:set_cookie(<XXX>).
图形化监测工具
Appmon
> appmon:start().
WebTool版Appmon
> webtool:start().
Pman(process manager)
> pman:start().
Debugger
$ erlc +debug_info –o ebin src/*.erl
> debugger:start().
表查看器
> tv:start().
工具栏
> toolbar:start().
参考文献
[1] Cesarini F., Thompson S.著,慕尼黑Isar工作组 杨剑译.
Erlang编程指南.
北京: 机械工业出版社.2011.
[2] Armstrong J.著,牛化成 译.
Erlang程序设计(第2版).(Programming Erlang, Second Edition – Software for a Concurrent World).
北京: 人民邮电出版社.2014.
Erlang 101 Erlang环境和顺序编程 - should done in 2014-10-26