1。Erlang的保留字有:
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
基本都是些用于邏輯運(yùn)算、位運(yùn)算以及特殊表達(dá)式的符號(hào)
2.Erlang的類(lèi)型,除了在前面入門(mén)一提到的類(lèi)型外,還包括:
1)Binary,用于表示某段未知類(lèi)型的內(nèi)存區(qū)域
比如:
1>
<<10,20>>. <<10,20>>
2>
<<"ABC">>. <<65,66,67>>
2)Reference,通過(guò)調(diào)用mk_ref/0產(chǎn)生的運(yùn)行時(shí)的unique term
3)String,字符串,Erlang中的字符串用雙引號(hào)包括起來(lái),其實(shí)也是list。編譯時(shí)期,兩個(gè)鄰近的字符串將被連接起來(lái),比如"string" "42" 等價(jià)于 "string42"
4)Record,記錄類(lèi)型,與c語(yǔ)言中的struct類(lèi)似,模塊可以通過(guò)-record屬性聲明,比如:
-module(person).
-export([new/2]).
-record(person, {name, age}).
new(Name, Age) ->
#person{name=Name, age=Age}.
1>
person:new(dennis, 44). {person,dennis,44}
在編譯后其實(shí)已經(jīng)被轉(zhuǎn)化為tuple。可以通過(guò)Name#person.name來(lái)訪(fǎng)問(wèn)Name Record的name屬性。
3.模塊的預(yù)定義屬性:
-module(Module).
聲明模塊名稱(chēng),必須與文件名相同
-export(Functions).
指定向外界導(dǎo)出的函數(shù)列表
-import(Module,Functions).
引入函數(shù),引入的函數(shù)可以被當(dāng)作本地定義的函數(shù)使用
-compile(Options).
設(shè)置編譯選項(xiàng),比如export_all
-vsn(Vsn). 模塊版本,設(shè)置了此項(xiàng),可以通過(guò)
beam_lib:version/1
獲取此項(xiàng)信息
可以通過(guò)-include和-include_lib來(lái)包含文件,兩者的區(qū)別是include-lib不能通過(guò)絕對(duì)路徑查找文件,而是在你當(dāng)前Erlang的lib目錄進(jìn)行查找。
4.try表達(dá)式,try表達(dá)式可以與catch結(jié)合使用,比如:
try Expr
catch
throw:Term -> Term;
exit:Reason -> {'EXIT',Reason}
error:Reason -> {'EXIT',{Reason,erlang:get_stacktrace()}}
end
不僅如此,try還可以與after結(jié)合使用,類(lèi)似java中的try..finally,用于進(jìn)行清除作用,比如:
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.列表推斷(List Comprehensions),函數(shù)式語(yǔ)言特性之一,Erlang中的語(yǔ)法類(lèi)似:
[Expr || Qualifier1,...,QualifierN]
Expr可以是任意的表達(dá)式,而Qualifier是generator或者filter。還是各舉例子說(shuō)明下。
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]
再看幾個(gè)比較酷的例子,來(lái)自Programming Erlang,
比如快速排序:
-module(qsort).
-export([qsort/1]).
qsort([])->[];
qsort([Pivot|T])->
qsort([X||X<-T,X
6.宏,定義常量或者函數(shù)等等,語(yǔ)法如下:
-define(Const, Replacement).
-define(Func(Var1,...,VarN), Replacement).
使用的時(shí)候在宏名前加個(gè)問(wèn)號(hào)?,比如?Const,Replacement將插入宏出現(xiàn)的位置。系統(tǒng)預(yù)定義了一些宏:
?MODULE 表示當(dāng)前模塊名
?MODULE_STRING 同上,但是以字符串形式
?FILE 當(dāng)前模塊的文件名
?LINE 調(diào)用的當(dāng)前代碼行數(shù)
?MACHINE 機(jī)器名
Erlang的宏與C語(yǔ)言的宏很相似,同樣有宏指示符,包括:
-undef(Macro).
- 取消宏定義
-ifdef(Macro).
- 當(dāng)宏Macro有定義的時(shí)候,執(zhí)行以下代碼
-ifndef(Macro).
- 同上,反之
-else.
- 接在ifdef或者ifndef之后,表示不滿(mǎn)足前者條件時(shí)執(zhí)行以下代碼
-endif.
- if終止符
假設(shè)宏-define(Square(X),X*X).用于計(jì)算平方,那么??X將返回X表達(dá)式的字符串形式,類(lèi)似C語(yǔ)言中#arg
一個(gè)簡(jiǎn)單的宏例子:
ruby 代碼
- -module(macros_demo).
- -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]).
當(dāng)編譯時(shí)不開(kāi)啟debug選項(xiàng)的時(shí)候:
17> c(macros_demo).
{ok,macros_demo}
18> macros_demo:test().
square(3) is 9
當(dāng)編譯時(shí)開(kāi)啟debug之后:
19> c(macros_demo,{d,debug}).
{ok,macros_demo}
20> macros_demo:test().
{macros_demo,11}: 3
square(3) is 9
ok
可以看到LOG的輸出了,行數(shù)、模塊名以及參數(shù)
7、
Process Dictionary,每個(gè)進(jìn)程都有自己的process dictionary,用于存儲(chǔ)這個(gè)進(jìn)程內(nèi)的全局變量,可以通過(guò)下列
BIFs操作:
put(Key, Value)
get(Key)
get()
get_keys(Value)
erase(Key)
erase()
8、關(guān)于分布式編程,需要補(bǔ)充的幾點(diǎn)
1)節(jié)點(diǎn)之間的連接默認(rèn)是transitive,也就是當(dāng)節(jié)點(diǎn)A連接了節(jié)點(diǎn)B,節(jié)點(diǎn)B連接了節(jié)點(diǎn)C,那么節(jié)點(diǎn)A也與節(jié)點(diǎn)C互相連接
可以通過(guò)啟動(dòng)節(jié)點(diǎn)時(shí)指定參數(shù)-connect_all false來(lái)取消默認(rèn)行為
2)隱藏節(jié)點(diǎn),某些情況下,你希望連接一個(gè)節(jié)點(diǎn)而不去連接其他節(jié)點(diǎn),你可以通過(guò)在節(jié)點(diǎn)啟動(dòng)時(shí)指定-hidden選項(xiàng)
來(lái)啟動(dòng)一個(gè)hidden node。在此情況下,通過(guò)nodes()查看所有連接的節(jié)點(diǎn)將不會(huì)出現(xiàn)隱藏的節(jié)點(diǎn),想看到隱藏的節(jié)點(diǎn)
可以通過(guò)nodes(hidden)或者nodes(connected)來(lái)查看。
完整的erl選項(xiàng)如下:
-connect_all false |
上面已經(jīng)解釋。 |
-hidden |
啟動(dòng)一個(gè)hidden node
|
-name Name |
啟動(dòng)一個(gè)系統(tǒng)成為節(jié)點(diǎn),使用long name. |
-setcookie Cookie |
與Erlang:set_cookie(node(), Cookie) .相同,設(shè)置magic cookie
|
-sname Name |
啟動(dòng)一個(gè)Erlang系統(tǒng)作為節(jié)點(diǎn),使用short name
|
注意,
short name啟動(dòng)的節(jié)點(diǎn)是無(wú)法與long name節(jié)點(diǎn)通信的。
.一個(gè)小細(xì)節(jié),在Erlang中小于等于是用=<表示,而不是一般語(yǔ)言中的<=語(yǔ)法,我犯過(guò)錯(cuò)誤的地方,同樣,不等于都是用/號(hào),而不是
!,比如/=、=/=。
10.and or 和andalso orelse的區(qū)別
and和or會(huì)計(jì)算兩邊的表達(dá)式,而andalso和orelse的求值采用短路機(jī)制,比如exp1 andalso exp2,當(dāng)exp1返回false之后,就不會(huì)去求值
exp2,而是直接返回false,而exp1 and exp2會(huì)對(duì)exp1和exp2都進(jìn)行求值,or與orelse也類(lèi)似。
posted on 2009-09-11 10:16
暗夜教父 閱讀(691)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
erlang