一、算数表达式及其优先级
操作符 | 描述 | 参数 | 优先级 |
---|---|---|---|
X+/-Y | 加减法 | 数值 | 3 |
X*/Y | 乘除法 | 数值 | 2 |
X div Y | 整除 | 整数 | 2 |
X rem Y | 取余 | 整数 | 2 |
X band Y | 按位于 | 整数 | 2 |
X bor Y | 按位或 | 整数 | 3 |
X bxor Y | 按位异或 | 整数 | 3 |
X bsl N | 左移 | 整数 | 3 |
X bsr N | 右移 | 整数 | 3 |
bnot | 按位取反 | 整数 | 2 |
二、元数(arity)
即函数的参数个数
三、属性
1.预定义的模块属性
-
-module(modname).
modname必须是一个原子类型,且和文件名一致 -
-import(Mod,[Fun1/Arity,...])
从Mod中导入列表中的函数到本模块中,调用时就无需指定模块名了,但是erlang标准库是不用导入的 -
-export([Fun1/Arity,....])
导出当前模块里的函数,只有导出之后才可以被外部调用 -
-compile(Options)
编译器的编译选项,可以是单个,也可以是列表 -
-vsn(Version)
指定模块的版本号,Version可以是任何字面数据类型
2.用户定义的模块属性
- -sometag(Value)
sometag必须是一个原子类型,Value是一个字面数据类型,编译时会被打包,运行时可以读取属性
读取方法:modname:module_info()
返回一个列表,Value在其中一个tag为attributes的元组中
另一种读取方法:beam_lib:chunks("ModSrc",[attributes])区别在于前者需要加载模块,后者不需要
四、块表达式
应用场景:代码某处要求是单个表达式,但我们需要做多个事情,也就是使用表达式序列。
举例:
begin
Expr1,
...,
ExprN
end.
五、布尔值
Erlang没有单独的布尔值类型,但是可以用原子类型的true和false表示
六、布尔表达式
- not B1:逻辑非
- B1 and B2:逻辑与
- B1 or B2:逻辑或
- B1 xor B2:逻辑异或
七、注释
Erlang的注释符号是%,很可惜,他有没有块的注释
八、包含文件
- -include(FileSrc).
- -include_lib(FileSrc).
包含文件的扩展名是.hrl,比如记录的定义会放在hrl里方便统一rr
九、宏
1.定义方法
- -define(Constant,Replacement).
- -define(Func(Var1,...,VarN),replacement).
当处理器遇到了类似?MacroName形式的表达式时,会展开这个宏,并进行计算替换
-define(Func(a,b),{a,b}).
foo(A)->
?Func(1,1).%扩展之后就是{1,1}
还有一些预定义提供了当前模块的信息
- ?FILE展开当前的文件名
- ?MODULE展开当前的模块名
- ?LINE展开当前的行号
2.宏控制流
- -undef().取消宏定义
- -ifdef().判断是否定义过,true则往下执行
- -ifndef().false则往下执行
- -else.用于ifdef和ifndef后面
- -endif.用于结束ifdef和ifndef
举例:
-ifdef(debug_flag).
-define(DEBUG(X),io:format("DEBUG ~p:~p ~p~n",[?MODULE,?LINE,X])).
-else.
-define(DEBUG(X),void).
-endif.
十一、进程字典
相当于erlang进程里的私有数据区域。
操作BIF:
- put(Key,Value)->OldValue.键存在则更新值,不存在则创建关联
- get(Key)->Value.
- get()->[{Key,Value}]返回整个字典
- get_keys(Value)->[Key]返回值是Value的所有Key
- erase(Key)->Value 删除Key.
- erase()->[{Key,Value}]删除整个字典
十二、比较数据类型
这里侧重讲其中4个
- ==
这个比较要慎重使用,100次里有99次应该用的是=:=
==只有在比较浮点数和整数时可用。 - /=与=/=
/=这个比较的意思是不等于,而=/=的意思是不完全相同
网友评论