这是10.4的:
erlang过程编程知识:
erlang中,函数定义的->前,可以使用when xxx限定该clause的使用范围。这里的xxx称为guard。
erlang中的等号“=”,称为匹配操作符(match operator),其作用不单单是对变量进行初次赋值,主要是说明等号两侧的对象是匹配的,同时也可以对左侧的初次定义的变量进行赋值。因为是匹配操作符,而不是赋值操作符,所以可以使用5=M这种表达式(这里的M必须已经赋值了)
erlang中的if condition1->action1; condition2->action2 end结构相当于java和C中的switch。注意最后一个condition->action后,end前不能加分号。if结构中必须有至少一个condition是符合的,否则程序出错,所以最后一个condition通常为true,类似switch中的default。condition中可以使用逗号分隔两个condition,表示and,用分号分隔两个condition,表示or。
除了if之外,erlang中还有一个条件结构case Variable of xxx1->action1;xxx2->action2 end。这里的xxx1可以是一个tuple,其中各个值由Variable的值进行赋值。xxx1和->之间可以带上when子串。
condition中,==, >=和C中一样,但小于等于和不等于不同:=<和/=
BIF: built-in functions
高阶函数(High Order Function):
X = fun(A)->A+2 end. 如:
lists:map(fun(X)->X*3 end, [1,2,3]).,执行结果如下:[3,6,9]。
对于已经定义的函数,在高阶函数中引用它时可以使用 fun FunctionName/Arity的方式:fun func1/2。
在匹配时,如果不关心一个变量的值,可以使用_代替这个变量的名字,这里“_”称为匿名变量。
erlang并发编程和分布式编程知识:
BIF spawn有三个参数:模块名,函数名,参数列表。spawn返回一个pid(如<0.63.0>)。
发送消息:pid ! message
接收消息:receive msg1->action1;msg2->action2 end
self()返回自己的pid
注:erlang中,逗号用于分隔单独表达式,分号用于分隔推导式(->),句号用于分隔函数定义。同一个推导式内部不能用分号分隔。
register(some_atom, Pid)将把pid注册为名字some_atom,此时可以直接用some_atom ! msg发送消息。这个注册只在本erlang节点有效,跨界点发送时必须使用{some_atom, NodeName} ! msg发送消息。
spawn(NodeName, module, function, arglist)在NodeName节点上启动一个进程,所有输入输出都重定向到自己。
erlang分布式部署时,每个erlang系统是一个erlang节点,每个节点必须在当前用户home目录下存在文件.erlang.cookie,内容是一个相同的atom,用以做验证用。erlang启动时使用参数-sname name指定节点名,通信时使用NodeName@HostName指定一个节点。 pid中带有了节点信息。
receive可以加after TimeInMilliSeconds -> action到end前,用作超时处理