read(IoDevice, Prompt, StartLine)
-module(zog).我将process修改一?/span>Q?br>
%% This is a test program that first creates N processes (that are
%% "connected" in a ring) and then sends M messages in that ring.
%%
%% - September 1998
%% - roland
-export([start/0, start/1, start/2]).
-export([run/2, process/1]). % Local exports - ouch
start() -> start(16000).
start(N) -> start(N, 1000000).
start(N, M) -> spawn(?MODULE, run, [N, M]).
run(N, M) when N < 1 ->
io:format("Must be at least 1 process~n", []),
0.0;
run(N, M) ->
statistics(wall_clock),
Pid = setup(N-1, self()),
{_,T1} = statistics(wall_clock),
io:format("Setup : ~w s", [T1/1000]),
case N of
1 -> io:format(" (0 spawns)~n", []);
_ -> io:format(" (~w us per spawn) (~w spawns)~n",
[1000*T1/(N-1), N-1])
end,
statistics(wall_clock),
Pid ! M,
K = process(Pid),
{_,T2} = statistics(wall_clock),
Time = 1000*T2/(M+K),
io:format("Run : ~w s (~w us per msg) (~w msgs)~n",
[T2/1000, Time, (M+K)]),
Time.
setup(0, OldPid) ->
OldPid;
setup(N, OldPid) ->
NewPid = spawn(?MODULE, process, [OldPid]),
setup(N-1, NewPid).
process(Pid) ->
receive
M ->
Pid ! M-1,
if
M < 0 -> -M;
true -> process(Pid)
end
end.
process(Pid) ->然后执行下zog:run(3,3)Q?span style="font-weight: bold;">你将发现消息l了两圈q束了Q第三圈Ҏ没有q行Q不知道试者是什么用意?span style="font-weight: bold;">依照现在的执?00万次消息传送竟然只需?毫秒Q我修改了下了下代码如下Q?br>-module(zog).
receive
M ->
Pid ! M-1,
io:format("form ~w to ~w~n",[self(),Pid]),
if
M < 0 -> -M;
true -> process(Pid)
end
end.
after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor
基本都是些用于逻辑q算、位q算以及Ҏ表达式的W号-module(Module).
声明模块名称Q必M文g名相?br>-export(Functions).
指定向外界导出的函数列表-import(Module,Functions).
引入函数Q引入的函数可以被当作本地定义的函数使用-compile(Options).
讄~译选项Q比如export_allbeam_lib:version/1
获取此项信息try Expr
catch
throw:Term -> Term;
exit:Reason -> {'EXIT',Reason}
error:Reason -> {'EXIT',{Reason,erlang:get_stacktrace()}}
end
不仅如此Qtryq可以与afterl合使用Q类似java中的try..finallyQ用于进行清除作用,比如Q?br>termize_file(Name) -> {ok,F} = file:open(Name, [read,binary]), try {ok,Bin} = file:read(F, 1024*1024), binary_to_term(Bin) after file:close(F) end.
5.列表推断QList ComprehensionsQ,函数式语aҎ之一QErlang中的语法cMQ?br>[Expr || Qualifier1,...,QualifierN] Expr可以是Q意的表达式,而Qualifier是generator或者filter。还是各举例子说明下?br>1> [X*2 || X <- [1,2,3]]. [2,4,6]
2> L=[1,2,3,4,5,6,7].
[1,2,3,4,5,6,7]
3> [X|X<-L,X>=3].
[3,4,5,6,7]
再看几个比较L例子Q来自Programming ErlangQ?br>比如快速排?/span>Q?br>-module(qsort).
-export([qsort/1]).
qsort([])->[];
qsort([Pivot|T])->
qsort([X||X<-T,X<Pivot])
++ [Pivot] ++
qsort([X||X<-T,X>=Pivot]).
搜烦勾股数组Q?br>%勾股数组
-module(pythag).
-export([pythag/1]).
pythag(N)->
L=lists:seq(1,N),
Square=fun(X) when is_number(X)->X*X end,
[{A,B,C}||
A<-L,
B<-L,
C<-L,
A+B+C=<N,
Square(A)+Square(B)=:=Square(C)].
列表推断大大减你的敲击键盘的ơ数?br>
6.?/span>Q定义常量或者函数等{,语法如下Q?br>-define(Const, Replacement). -define(Func(Var1,...,VarN), Replacement).
使用的时候在宏名前加个问PQ比?ConstQReplacement插入宏出现的位|。系l预定义了一些宏:?MODULE 表示当前模块?br>
?FILE 当前模块的文件名
?MODULE_STRING 同上Q但是以字符串Ş?br>
?LINE 调用的当前代码行?br>?MACHINE 机器?br>
Erlang的宏与C语言的宏很相|同样有宏指示W,包括Q?br>假设?define(Square(X),X*X).用于计算qxQ那??X返回X表达式的字符串Ş式,cMC语言?arg
-undef(Macro).
- 取消宏定?
-ifdef(Macro).
- 当宏Macro有定义的时候,执行以下代码
-ifndef(Macro).
- 同上Q反?
-else.
- 接在ifdef或者ifndef之后Q表CZ满前者条件时执行以下代码
-endif.
- ifl止W?/dd>
一个简单的宏例子:
-module(macros_demo).当编译时不开启debug选项的时候:
-ifdef(debug).
-define(LOG(X), io:format("{~p,~p}: ~p~n", [?MODULE,?LINE,X])).
-else.
-define(LOG(X), true).
-endif.
-define(Square(X),X*X).
-compile(export_all).
test()->
A=3,
?LOG(A),
B=?Square(A),
io:format("square(~w) is ~w~n",[A,B]).
17> c(macros_demo).
{ok,macros_demo}
18> macros_demo:test().
square(3) is 9
当编译时开启debug之后Q?br>
19> c(macros_demo,{d,debug}).
{ok,macros_demo}
20> macros_demo:test().
{macros_demo,11}: 3
square(3) is 9
ok
可以看到LOG的输ZQ行数、模块名以及参数
7?span style="font-weight: bold;">Process DictionaryQ每个进E都有自qprocess dictionaryQ用于存储这个进E内的全局变量Q可以通过下列
BIFs操作Q?br>put(Key, Value)
get(Key)
get()
get_keys(Value)
erase(Key)
erase()
8、关于分布式~程Q需要补充的几点
1Q节点之间的q接默认是transitiveQ也是当节点Aq接了节点BQ节点Bq接了节点CQ那么节点A也与节点C互相q接
可以通过启动节点时指定参?connect_all false来取消默认行?br>
2Q隐藏节点,某些情况下,你希望连接一个节点而不去连接其他节点,你可以通过在节点启动时指定-hidden选项
来启动一个hidden node。在此情况下Q通过nodes()查看所有连接的节点不会出现隐藏的节点Q想看到隐藏的节?br>可以通过nodes(hidden)或者nodes(connected)来查看?br>
完整的erl选项如下Q?br>
-connect_all false
上面已经解释? -hidden
启动一个hidden node
-name Name
启动一个系l成点,使用long name. -setcookie Cookie
?code>Erlang:set_cookie(node(), Cookie).相同Q设|magic cookie
-sname Name
启动一个Erlangpȝ作ؓ节点Q用short name
注意,short name启动的节Ҏ无法与long name节点通信?/span>?br>
9.一个小l节Q在Erlang中小于等于是?<表示Q而不是一般语a中的<=语法Q我犯过错误的地方,同样Q不{于都是?P而不?/span>
!,比如/=?/=?/span>
10.and or 和andalso orelse的区?/span>
and和or会计两边的表达式,而andalso和orelse的求值采用短路机Ӟ比如exp1 andalso exp2Q当exp1q回false之后Q就不会L?br>exp2Q而是直接q回falseQ而exp1 and exp2会对exp1和exp2都进行求|or与orelse也类伹{?br>
今天?a >erlang-china下到了《Programming Erlang》,准备打印一份看看,q入OTP的学习?
ACS/DunderQ项?W二阶段Q重新改造了完整的MD-110pȝ?/10Q结?相比于用PLEX的构建有>>10倍的效率提高Q?
apply(Mod, Func, Args),三个参数分别是模块、函C及参数列表,比如调用我们的第一个ErlangE序Q?br>if和case语句都有一个问题,是当没有模式匹配或者Grard都是false的时候会DerrorQ这个问题case可以增加一个类似java中default的:apply(helloWorld,run,[dennis]).13.if和case语句Qif语句的结构如下:
if
Guard1 ->
Sequence1 ;
Guard2 ->
Sequence2 ;
...
end
而case语句的结构如下:
case Expr of
Pattern1 [when Guard1] -> Seq1;
Pattern2 [when Guard2] -> Seq2;
PatternN [when GuardN] -> SeqN
end