首页 > 代码库 > 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.cookieUSER_HOME目录下。

 

> net_adm:ping(<Node>).

> auth:set_cookie(<XXX>).

 

图形化监测工具

Appmon

> appmon:start().

WebToolAppmon

> 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