erlang读书笔记

来源:互联网 发布:手写字体生成器软件 编辑:程序博客网 时间:2024/06/05 03:54
http://erlang.org/doc/man/erlang.html


erl
编译 erlc
c(module).


执行
module:接口().


spawn(module, 接口, [参数1,参数2,...]) 启动一个并行进程


halt(). 退出
q(). 安全退出
q()是init:stop()命令在shell
里的别名。
要立即停止系统,应执行表达式erlang:halt()


百分号字符(%)代表一段注释


变量以大写字母开头,赋值后不能改变
原子是全局性的
atom原子量以小写字母开头,不能进行赋值
原子以小写字母开头,后接一串字母、数字、下划线(_)或at(@)符号
原子还可以放在单引号(')内。可以用这种引号形式创建以大写字母开头


元组 {}
作为占位符,用于表示不感兴趣的那些变量。符号_被
称为匿名变量。与正规变量不同,同一模式里的多个_不必绑定相同的值


列表[]
可以给T的开头添加不止一个元素,写法是[E1,E2,..,En|T]


Guide
关卡不能调用用户定义的函数,因为要确保它们没有副作用并能正常结束
,相当于&&.  ;相当于||


=:=用来测试是否相等


内置函数list_to_tuple/1能将一个列表转换成元组,time/0以{时,分,秒}
的格式返回当前的时间


[ F(X) || X <- L]标记的意思是“由F(X)组成的列表(X从列表L中提取)”


List ++ [H] 存在效率问题


字符串
\x{221e}这种记法的作用是输入一个代表Unicode无穷大字符的十六进制整数(8734)。




 pwd()打印当前工作目录。
 ls()列出当前工作目录里所有的文件名。
 cd(Dir)修改当前工作目录至Dir。


Pid ! Msg语法的意思是发送消息Msg到进程Pid
pid ! {self(), "message"}.


// 循环
loop()
recive
{from, message} ->
...
end,
loop()


<0.47.0>是文件服务器进程的进程标识符。它的显示方式是尖括号内由句号分隔的三个整数


N div M是让N除以M然后舍去余数。N rem M是N除以M后剩下的余数


记录
-record(recordName, {key=value,key2})
rf(todo)


映射
#{key=>value} 创建or修改
#{key:=newValue} 修改
newMap=oldMap#{key=>value}


把一个包含JSON数据的二进制型转换成映射组。Bin里的任何原子必须在调用此内置函数
前就已存在,否则就会抛出一个异常错误。这样做是为了防止创建大量的新原子。出于效
率的原因,Erlang不会垃圾回收(garbage collect)原子,所以连续不断地添加新原子会(在
很长一段时间后)让Erlang虚拟机崩溃。


防御式编程




Erlang里的一切都是表达式,而表达式都具有值


栈跟踪信息
erlang:get_stacktrace


二进制
<<99,97,116>>




-compile(export_all).这个编译器选项经常会在调试程序时用到。它会导出模
块里的所有函数,无需再显式使用-export标识了。


在任一时刻,Erlang允许一个模块的两个版本同时运行:当前版和旧版。重新编译某个模块
时,任何运行旧版代码的进程都会被终止,当前版成为旧版,新编译的版本则成为当前版


io:format(String, [Args])


k进制
K#Digits



?FILE展开成当前的文件名;
?MODULE展开成当前的模块名;
?LINE展开成当前的行号


元组模块
调用M:f(Arg1, Arg2, ..., ArgN)时,我们假定M是一个模块名。但M也可以是一个形式
为{Mod1, X1, X2, ... Xn}的元组。在这种情况下,调用的函数就是Mod1:f(Arg1, Arg2, ...,
Arg3, M)




下划线变量有两种主要的用途。
 命名一个我们不打算使用的变量。例如,相比open(File, _),open(File, _Mode)这
种写法能让程序的可读性更高。
 用于调试


类型语法
T1::A|B|C...


any()是指任意Erlang数据类型
none()标识则用来指代永不返回的函数类型


定义新类型
-type newTypeName(TVar1,TVar2,...,TVarN)::Type.


导出类型
-export_type(...)




避免干扰dialyzer
1、避免使用-compile(export_all)
2、为模块导出函数的所有参数提供详细的类型规范。尽量给导出函数的参数设置最严格的
限制
3、为记录定义里的所有元素提供默认的参数。如果不提供,原子undefined就会被当成默认
值,而这个类型会逐渐扩散到程序的其他部分,可能导致奇特的类型错误
4、把匿名变量用作函数的参数经常会导致结果类型不如你预想得那么精确。要尽可能地给
变量添加限制。


格式字符串里的~w
是指忠实地打印列表,而不对输出结果进行美
\b 退格符8
\d 删除符127
\e 换码符27
\f 换页符12
\n 换行符10
\r 回车符13
\s 空格符32
\t 制表符9
\v 垂直制表符11
\x{...} 十六进制字符(...是十六进制字符)
\^a..\^z或\^A..\^Z Ctrl+A至Ctrl+Z 1至26
\' 单引号39
\" 双引号34
\\ 反斜杠92
\C C的ASCII编码(C是一个字符) (一个整数)




X > Y X大于Y
X < Y X小于Y
X =< Y X等于或小于Y
X >= Y X大于或等于Y
X == Y X等于Y
X /= Y X不等于Y
X =:= Y X与Y完全相同
X =/= Y X与Y不完全相同


number<atom<reference<fun<port<pid<tuple(and record)<map<list<binary




^A 行首
^D 删除当前字符
^E 行尾
^F或右箭头键 向前的字符
^B或左箭头键 向后的字符
^P或上箭头键 前一行
^N或下箭头键 下一行
^T 调换最近两个字符的位置
Tab 尝试扩展当前模块或函数的名称




is_atom(X) X是一个原子
is_binary(X) X是一个二进制型
is_constant(X) X是一个常量
is_float(X) X是一个浮点数
is_function(X) X是一个fun
is_function(X, N) X是一个带有N个参数的fun
is_integer(X) X是一个整数
is_list(X) X是一个列表
is_map(X) X是一个映射组
is_number(X) X是一个整数或浮点数
is_pid(X) X是一个进程标识符
is_pmod(X) X是一个参数化模块的实例
is_port(X) X是一个端
is_reference(X) X是一个引用
is_tuple(X) X是一个元组
is_record(X,Tag) X是一个类型为Tag的记录
is_record(X,Tag,N) X是一个类型为Tag、大小为N的记录
abs(X) X的绝对值
byte_size(X) X的字节数,X必须是一个位串或二进制型
element(N, X) X里的元素N,注意X必须是一个元组
float(X) 将X转换成一个浮点数,X必须是一个数字
hd(X) 列表X的列表头
length(X) 列表X的长度
node() 当前的节点
node(X) 创建X的节点,X可以是一个进程、标识符、引用或端口
round(X) 将X转换成一个整数,X必须是一个数字
self() 当前进程的进程标识符
size(X) X的大小,它可以是一个元组或二进制型
trunc(X) 将X去掉小数部分取整,X必须是一个数字
tl(X) 列表X的列表尾
tuple_size(T) 元组T的大小






+ X + X 数字1
X  X 数字1
X * Y X * Y 数字2
X / Y X / Y(浮点除法) 数字2
bnot X 对X执行按位取反(bitwise not) 整数2
X div Y X被Y整除 整数2
X rem Y X除以Y的整数余数 整数2
X band Y 对X和Y执行按位与(bitwise and) 整数2
X + Y X + Y 数字3
X  Y X  Y 数字3
X bor Y 对X和Y执行按位或(bitwise or) 整数3
X bxor Y 对X和Y执行按位异或(bitwise xor) 整数3
X bsl N 把X向左算术位移(arithmetic bitshift)N位 整数3
X bsr N 把X向右算术位移N位 整数3




启动Erlang
erl -pa Dir -pa Dir2 ... -pz DirN


code:get_path()
code:add_patha(Dir)
code:add_pathz(Dir)
code:all_loaded()
code:clash()


寻找主目录
init:get_argument(home).


崩溃dump文件
crashdump_viewer:start(). 启动
erl_crash.dump 文件
http://localhost:8888/ 进行日志浏览




并发
spawn,send,receive
创建和销毁进程是非常快速的;
 在进程间发送消息是非常快速的;
 进程在所有操作系统上都具有相同的行为方式;
 可以拥有大量进程;
 进程不共享任何内存,是完全独立的;
 进程唯一的交互方式就是消息传递。




receive
...
after 0-> 零超时来实现某种形式的“优先接收”
...
end.


176
------------------------------------------------------------------------------------------------------------------------------


1. 新建立服务器
1) 上传dbfile,ebin,option,scripts四个文件夹
2) Dbfile中存放的是数据库中的表,其根据game.config生成
3) Ebin中存放编译后的代码,上传前需要将本地ebin中的数据删除然后执行make.cmd
重新生成编译好的加密文件
4) option中存放游戏的配置文件
5) scripts 中存放开启和关闭服务器的脚本


2. 更新服务器
1) 只需更新dbfile,ebin两个文件夹中的内容



0 0
原创粉丝点击