Erlang自学笔记(二)
根据昨天学习的内容,自己今天早上写了一个求阶乘的module.-module(mul).
-export().
jie(X) ->
Result = 1,
Result = mul(X,Result),
io:format("the result is ~w~n",).
mul(X,Result) when X>0 ->
mul(X-1,Result*X);
mul(0,Result) ->
Result.
写得可能比较粗糙,毕竟只学过一天.
补充昨天的一个概念:atoms,这个概念应该跟常量是一致的。就好象上面的一个方法mul(0,Result),其中0就是常量,全小写的字符串也是常量。
判断语句:
if
Condition 1 ->
Action 1;
Condition 2 ->
Action 2;
Condition 3 ->
Action 3;
Condition 4 ->
Action 4
end
其中Condition表示逻辑与的使用"," 表示逻辑或的使用";".
注意最后action中并没有分号结尾.
if 的用法
if
condition
action
end
case的用法
case Month of
sep -> 30;
apr -> 30;
jun -> 30;
nov -> 30;
feb when Leap == leap -> 29
end.
字符串,字符等等都有效。
一些关于lists的函数:
lists:foreach(Fun, ) #不产生新的list
lists:map(Fun, ) #产生一个新的list
lists:sort(fun({_, {c, Temp1}}, {_, {c, Temp2}}) ->
Temp1 < Temp2 end, New_list).
注意这里函数中的下划线表示一个变量,该变量在函数中不会使用,类似于占位符.
能够使用fun去声明一个函数
fx = fun(X) -> X*2 end.
fx能够作为参数传入foreach,map里面的Fun参数.
如果在modula里面,也可以用fun 方法名/参数数量来引用方法.
部分内建函数:
trunc() 砍断小数
round() 四舍五入
length()计算list长度
float()变为浮点数
is_atom()判断是否为atom数
is_tuple()判断是否为大括号的元素
最简单的并发和分布式编程例子
-module(tut17).
-export().
ping(0, Pong_Node) ->
{pong, Pong_Node} ! finished,
io:format("ping finished~n", []);
ping(N, Pong_Node) ->
{pong, Pong_Node} ! {ping, self()},#向进程ID为pong,而且节点为Pong_Node发送消息,self()方法为返回调用方法的进程ID
receive #阻塞等待消息
pong ->#这个是消息的pattern,其实与case类似
io:format("Ping received pong~n", [])
end,
ping(N - 1, Pong_Node).
pong() ->
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,#向进程ID 为Ping_PID发送信息
pong()
end.
start_pong() ->
register(pong, spawn(tut17, pong, [])).#其中spawn(moduleName,methodName,parameter)是用于创建进程的,进程之间的资源是不能共享的,但是这种进程并没有操作系统进程的重量级。而register方法用于注册进程名称,因为条用spawn方法后会翻回该进程的一个ID。
start_ping(Pong_Node) ->
spawn(tut17, ping, ).
ID ! 发送内容
这个就是线程发消息的方法.(其实进程ID信息已经包括全部,因此如果不是想发信息到使用了别名进程,只要用ID就可以了)
erl -sname 名称
就能启动不同的shell,再使用指明Pong_Node来进行分布式的调用
有了这个东西,弄一段简单的聊天工具就很容易了.
页:
[1]