Day 4 Advanced Sequential Programming
• BIF Build-In Functions,是在虚拟机里实现的,用erlang很难实现的功能,例如tuple_to_list,time等
• Binaries 中的整数只能在0-255
• term_to_binary,binary_to_term,list_to_binary
• 位操作
• M = <<X:3, Y:7, Z:6>><3 y:7 z:6=""><br>• X占三个bit,Y7个,Z6个<br><br><<>><br><<E1, E2, ..., En>><e1 e2 en=""><br><br>Ei = Value |<br> Value:Size |<br> Value/TypeSpecifierList |<br> Value:Size/TypeSpecifierList<br><br>• binary 数据只能表达8的整数倍的bits,因为是用byte来存储的<br>• 16#abc,表示16进制的abc,相当于10#2748.<br>• 16#abc = 2748 . <br>• erlang 支持2 到36进制<br>• 例如 4#213123123 = 161499.<br><br>• {ok,Bin}=file:read_file("/path/to/the/file"). 读文件<br><br>BIF apply : 相当于java中的反射调用<br>• apply(Mod, Func, [Arg1, Arg2, ..., ArgN])<br>• 相当于 直接调用 Mod:Func(Arg1, Arg2, ..., ArgN)<br>• 要尽量避免使用<br><br><b>Module Attributes</b><br><br>• predefined attributes:<br>• -module(modname).<br>• -import(Mod, [Name1/Arity1, Name2/Arity2,...]).<br>• -export([Name1/Arity1, Name2/Arity2, ...]).<br>• -compile(Options). 例如:-compile(export_all).<br>• -vsn(Virsion).没有其他含义,一般用来分析或者文档<br>• user defined attributes:<br>-module(attrs).<br>-vsn(1234).<br>-author({joe,armstrong}).<br>-purpose("example of attributes" ).<br>-export([fac/1]).<br>fac(1) -> 1;<br>fac(N) -> N * fac(N-1).<br><br>• 可以用Modname:module_info().来获取所有的attributes<br><br><b>Block Expressions</b><br><br>begin<br> Expr1,<br> ...,<br> ExprN<br>end<br><br>• 用在只允许一个表达式,但是又需要有很多代码的地方<br>• 他的值是最后一个表达式的值<br><br><b>include</b><br><br>• include的文件都是以.hrl结尾的<br>• include(FileName). 使用相对路径或者绝对路径<br>• include_lib(Name).<br><br><b>Macro </b><br>• 定义:<br>-define(Constant, Replacement).<br>-define(Func(Var1, Var2,.., Var), Replacement).<br><br>• 使用?MacroName 引用<br>• 预定义的<br>• ?FILE当前文件<br>• ?MODULE当前module<br>• ?LINE当前行<br>• -undef(Macro).<br>• -ifdef(Macro).<br>• -ifndef(Macro).<br>• -else.<br>• -endif.<br>• <br><br><b>Numbers</b><br>• 整数,整数的大小没有限制(受内存大小限制,废话)<br>• 整数的三种写法:<br>• 1. 一般的,123,1231231,-34234<br>• 2. n进制,最大到36进制,例如 0 -65 2#010001110 -8#377 16#fe34 16#FE34 36#wow<br>• 3. $+字符,例如 $a 表示97,就是a的ascii码,$\n表示10<br>• 浮点数,例如 1.0 3.14159 -2.3e+6 23.56E-27,内部表示都是IEEE 754 64-bit<br>• 浮点数的表达区间是 −10^323 to 10^308<br><br><b>Process Dictionary</b><br><br>• 每个erlang进程都有一个私有的dictionary,可以保存一些属性<br>• @spec put(Key, Value) -> OldValue.<br>• @spec get(Key) -> Value.<br>• @spec get() -> [{Key,Value}].<br>• @spec get_keys(Value) -> [Key].<br>• @spec erase(Key) -> Value.<br>• @spec erase() -> [{Key,Value}].<br>• 一般不推荐使用,因为会破坏Varible not Vary的原则,如果使用,可以存放一些不会变动的内容。<br><br><br><b>其他内容</b><br>• erlang 的源代码都是使用iso-8859-1 编码的,erlang的字符串都是integer数组,因此内部没有编码问题<br>• 注释,使用 %,只有行注释,没有块注释<br>• 没有特别的boolean类型,true和false<br>• epp, Erlang preprocessor,处理macross和include,可以用compile:file(M, [’P’]). 来编译M.erl,然后把preprocess后的内容方到M.P里<br>• function引用,fun mod_name:fun_name/Arity,如果在同一个module,mod_name可以省略<br>• list操作的++ 和 --,注意--是将第一个出现的值去掉<br>• 在 erlang shell里,可以用c(Module,{}).来编译module,可以传一些参数进去<br>• andalso/orelse 和and / or的区别主要在于懒惰,能不执行的时候就不执行,and/or的表达式都是一定会执行的<br>• number < atom < reference < fun < port < pid < tuple < list < binary<br>• =:= =/= 和 == /=的区别,一个是绝对一样,另一个是差不多相等<br>• 使用下划线开头的变量,如果未被使用,编译器不会警告<br>• 可以在作pattern match的时候将match的内容命名,供后面使用,可以提高效率(避免重新生成内容),例如:<br><br>func1([{tag, {one, A}=Z1, B}=Z2|T]) -><br> ..,.<br> ... f(..., Z2, ...),<br> ... g(..., Z1, ...),<br> ...<br><br></e1></3>