如果一種編程語(yǔ)言只能通過(guò) shell 來(lái)運(yùn)行代碼,那么這種語(yǔ)言基本上沒什么太大的用處,Erlang 同樣可以通過(guò)腳本來(lái)運(yùn)行程序。這里有一小段 Erlang 程序。使用合適的文本編輯器將其輸入到文件 tut.erl 中。文件名稱必須為 tut.erl 不能任意修改,并且需要將其放置于你啟動(dòng) erl 命令時(shí)所在的目錄下。如果恰巧你的編輯器有 Erlang 模式的話,那么編輯器會(huì)幫助你優(yōu)雅地組織和格式化你的代碼 (參考 Emacs 的 Erlang 模式),不過(guò)即使你沒有這樣的編輯器你也可以很好地管理你自己的代碼。Number、ShoeSize 和 Age 都是變量。
- -module(geometry). %模塊聲明,模塊名必須與文件名相同。
- -export([area/1]). %導(dǎo)出聲明,聲明可以外部使用的函數(shù)
- area({rectangle, Width, Height}) -> Width*Height; %子句1
- area({square, Side}) -> Side * Side.%子句2
這個(gè)函數(shù) area 多個(gè)子句,子句之間用;分開。
- 17> c("ErlangGame/geometry.erl").
- ErlangGame/geometry.erl:1: Warning: Non-UTF-8 character(s) detected, but no encoding declared. Encode the file in UTF-8 or add "%% coding: latin-1" at the beginning of the file. Retrying with latin-1 encoding.
- {ok,geometry}
- c("e:/mywokespace/ErlangGame/geometry.erl").%使用絕對(duì)路徑
- c("ErlangGame/geometry.erl").%使用相對(duì)路徑,這個(gè)時(shí)候我所在的目錄是e:/mywokespace/
- c(geometry).%使用相對(duì)路徑、去掉雙引號(hào)。因?yàn)闆]有.號(hào),可以使用原子。
編譯的輸出了警告:
ErlangGame/geometry.erl:1: Warning: Non-UTF-8 character(s) detected, but no encoding declared. Encode the file in UTF-8 or add "%% coding: latin-1" at the beginning of the file. Retrying with latin-1 encoding.
這是因?yàn)槲覍懥俗⑨專⑨屖菨h字,使用了 UTF-8。去掉的話,就會(huì):
{ok,geometry}
只有這個(gè)了。
編譯之后,調(diào)用模塊是不用加這個(gè)路徑了。
- 1> Double = fun(x)->2*x end.
- #Fun<erl_eval.6.52032458>
- 2> Double(2).
- ** exception error: no function clause matching
- erl_eval:'-inside-an-interpreted-fun-'(2)
函數(shù)定義是成功了,但是怎么調(diào)用都報(bào)錯(cuò)。
試了好久好久,突然發(fā)現(xiàn)x是小寫的。在 Erlang 里面,x 就相當(dāng)于 C++ 的 'x'。是不能做變量的。
變量都是大寫開頭的。
- 3> Three = fun(X)-> 3 * X end.
- #Fun<erl_eval.6.52032458>
- 4> Three(2).
- 6
ok。成功了。
- 5> L = [1,2,3,4].
- [1,2,3,4]
- 6> lists:map(Three, L).
- [3,6,9,12]
這里調(diào)用了標(biāo)準(zhǔn)庫(kù)的模塊。標(biāo)準(zhǔn)庫(kù)是已經(jīng)編譯好的,可以直接使用。
直接把函數(shù)名傳進(jìn)去就行了。
lists:map 相當(dāng)于 for 循環(huán)
- 8> lists:filter(fun(X)->(X rem 2)=:=0 end,[1,2,3,4,5,6,7,8]).
- [2,4,6,8]
llists:filter 根據(jù)條件過(guò)濾列表的元素。
- 9> Fruit = [apple, pear, orange]. %創(chuàng)建一個(gè)列表
- [apple,pear,orange]
- 10> MakeTest = fun(L)->(fun(X)->lists:member(X,L) end) end.%創(chuàng)建一個(gè)測(cè)試函數(shù)。
- #Fun<erl_eval.6.52032458>
- 11> IsFruit = MakeTest(Fruit).%這里不是函數(shù)聲明,而是匹配了MakeTest的返回值。
- #Fun<erl_eval.6.52032458>
- 12> IsFruit(pear).%調(diào)用函數(shù)
- true
- 13> lists:filter(IsFruit, [dog, orange, cat, apple, bear]).%過(guò)濾
- [orange,apple]
MakeTest 內(nèi)聲明了一個(gè)函數(shù),因?yàn)槭亲詈笠粋€(gè)語(yǔ)句,所以被作為返回值。
在模塊里面加個(gè)函數(shù)
- -module(test). %模塊聲明,模塊名必須與文件名相同。
- -export([area/1,test/0,for/3]). %導(dǎo)出聲明,聲明可以外部使用的函數(shù)
- area({rectangle, Width, Height}) -> Width*Height; %子句
- area({square, Side}) -> Side * Side.
- test() ->
- 12 = area({rectangle, 3, 4}),
- 144 = area({square, 13}),
- tests_worked.
更多建議: