现在的位置: 首页 > 综合 > 正文

erlang基础笔记

2013年09月22日 ⁄ 综合 ⁄ 共 2024字 ⁄ 字号 评论关闭

进程管理器
可以使用pman:start()来启动进程管理器。类似于i()命令显示的。可以跟踪所有的发送和接收消息,以及内置函数和普通函数调用,以及并发相关的事件。进程管理器跟程序运行是很方便的。

应用监控器

通过appmon:start()调用启动应用监控器。

调试器
debugger:start(),启动图形化的调试器,可以进行断点跟踪。不过需要在编译模块时,加上调试标志,如下:
c(Module, [debug_info]).

测试函数性能
timer:tc(Modeul, Function, Arguments)
它返回一个元组,其中包含运行这个函数花费的时间和这个函数的返回值。

进程Pid
进程Pid在命令行中显示为,<0.0.0>,但我们创建一个Pid类型时应该使用内置函数,Pid = pid(0,40,0).

保护元
用逗号","来分隔保护元语句,这是一种逻辑乘,所有表达式为true的时候,它的结果才为true.
用分号";"来分隔各个保护元语句,这是一种逻辑加,如果有一个表达式的值为true,则它的结果就是true.

记录
eg: -record(person, {name, age, phone = "789"}).
定义记录时,可以给出默认值,构造一个记录如下:
Person = #person(name = "gavin", age = 99, phone = "1111").
修改一个记录
NewPerson = Person#person(age = 22).
终端中可以使用rd(name, {field,...})来直接定义一个记录,rl()可以列出目前终端中可见的记录定义。


eg: -define(TIMEOUT, 1000).
宏的名字大小写不要求,几个预定义宏:
?MODULE 模块名称
?MODULE_STRING 由它所在的模块的名称组成的字符串
?FILE 所在的文件名
?LINE 所在的行号
与其它语言相似的条件宏:
-undef(Flag).
-ifdef(Flag).
-ifndef(Flag).
-else.
-endif.

列表解析
列表解析可以完成映射——应用一个函数到列表中的每一个元素,还有过滤——选择一个列表中具有特定属性的元素。
一个列表解析有三个组成部分,表达式、保护元、生成器:
[Expression || Generators, Guards, Generators,...]
eg:
1>[x+1 || X <- [1,2,3]].
[2,3,4]
2> [{X,Y} || X <- [3,2,8], X < 9, Y <- [3,2,4], X > 3].
[{8,3},{8,2},{8,4}]
利用列表解析实现快排
qsort([])->
[];
qsort([X|Xs]) ->
qsort([Y || Y <- Xs, Y =< X]) ++ [X] ++ qsort([Y || Y <- Xs, Y > X]).

二进制类型
Bin = <<E1,E2,E3,...,En>>
eg:
11> Bin1 = <<14,22,99,97,98>>.
<<14,22,99,97,98>>
12> binary_to_list(Bin1).
[14,22,99,97,98]
函数binary_to_list将其转换成列表
二进制真正的长处在于,Bin的每个表达式都可以通过一个size和/或者type表达式来进行限定:
Expr:Size/Type
eg:
14> <<5:4, 5:4>>.
<<"U">>
取两个5的后4位组成一个字节
注意:表达式B=<<1>>,会被读作B =<<1>>, 所以<<和=要用一个空格分开,否则会报错。
位运算符:band,bor,bxor,bnot,bsl(位左移),bsr(位右移)

ETS表
表的类型有,set, ordered_set, bag, duplicate_bag
表的相关操作示例如下:
18> TableId = ets:new(myTable,[bag]).
24593
20> ets:insert(TableId, {alison,italy}).
true
21> ets:lookup(TableId, alison).
[{alison,italy}]
22> ets:delete(TableId, alison).
表的类型可以作为ets:new/2第二个参数,其它选项还有{keypos,Pos}、named_table等。
表的匹配,通过模式匹配从表中提取元素,相关函数ets:match/2, ets:select,'-'是通配符,'$0', '$1'是变量。
函数tv:start(),可以打开表的可视化工具。ets:info/1,打印表的信息。
注意:
1)ETS表不再需要时,需要调用ets:delete/2删除,否则内在不会回收,直到进程结束
2)匹配操作是作为内置函数来实现的,而内置函数是原子性的操作。因此,对一个巨大表的一个匹配操作会阻碍其他进程的执行,直到完成整个表的遍历
3)处理集合时一个通常的错误做法是,在插入一上更新前删除一个元素。这个删除操作是多余的,因为插入会自动覆盖旧的项元。

抱歉!评论已关闭.