Hello Erlang!

本系列文章是《Programming Erlang》的學(xué)習(xí)筆記

Erlang是什么

Erlang是由Ericsson開發(fā)的一種面向并發(fā)環(huán)境的函數(shù)式編程語言,
Erlang的并發(fā)性是語言虛擬機支持的,不依賴于OS。

Getting Stared

Erlang是面向并發(fā)環(huán)境的編程語言,一個Erlang程序是由多個并行的進程構(gòu)成的。進程執(zhí)行模塊中定義的函數(shù)。一個erl文件包含一個模塊,編譯后的erl文件就可以在shell中直接執(zhí)行了。

-module(hello).
-export([start/0]).

% Hello erlang
start() ->
    io:format("Hello Erlang!~n").

進入Erlang Shell(erl),就可以運行這個模塊了

使用c(hello).編譯hello模塊使用hello:start().調(diào)用start函數(shù),即可看見運行結(jié)果

$ erl
1> c(hello).
{ok, hello}
2> hello:start().
Hello Erlang~
ok
3> halt().
$

這是一個最簡單的Erlang模塊,我們可以通過這個模塊學(xué)習(xí)一下Erlang的基本語法。

  • 不難發(fā)現(xiàn),所以Erlang語句都以.結(jié)尾,一個Erlang語句以.+空白結(jié)束,空白可以是換行符,空格,tab,等等
  • -module(hello).聲明了一個名為hello的模塊
  • -export([start/0]).是這個模塊的導(dǎo)出函數(shù)列表,聲明了可以在模塊外部調(diào)用的函數(shù)列表,start/0表示start函數(shù)有0個參數(shù)
  • start() -> io:format("Hello Erlang!~n").是start函數(shù)的定義,io是erlang系統(tǒng)提供的模塊,format是io模塊導(dǎo)出的一個函數(shù)。因此,Erlang中調(diào)用函數(shù)的基本模式即為<module>:<function>(params).

Getting little sophisticated

Hello Erlang模塊闡述了一個最基本的Erlang模塊,和所有Hello World!程序一樣,這并沒有什么卵用。我們需要一個更復(fù)雜的程序來展示Erlang的基本編程模式。

%file_server.erl
-module(file_server).
-export([start/1, loop/1]).

start(Dir) ->
    spawn(file_server, loop, [Dir]).

loop(Dir) ->
    receive
        {Client, list_dir} ->
            Client ! {self(), file:list_dir(Dir)};
        {Client, {get_file, File}} ->
            Full = filename:join(Dir, File),
            Client ! {self(), file:read_file(Full)};
        {Client, {put_file, File, Content}} ->
            Full = filename:join(Dir, File),
            Client ! {self(), file:write_file(Full, Content)}
    end,
    loop(Dir).
  • 原子和變量,Erlang中變量以大寫字母開頭,小寫字母開頭的名稱被稱為原子,原子不是變量,而是符號常量,file_server程序中,list_dir,get_file,put_file都是原子而不是變量,模塊名也是原子

  • spawn函數(shù)用于啟動一個進程,并返回一個進程標識符。基本模式為spawn(<Module>, <Function>, [params])

  • self()獲取當(dāng)前進程的pid,erlang進程間通信依賴于pid

  • !用于向另一個進程發(fā)送消息,Erlang對現(xiàn)實的建模是通過這種輕量的進程間通信實現(xiàn)的,進程間交互使用消息。語法為<pid> ! <Message>

  • 接收消息,僅僅有發(fā)送消息是不夠的,還需要接收消息的語法來完成基于消息的進程間通信,接受消息的語法如下。

    receive
        {From ,Message} ->
            Handle the message
    

From記錄了消息的來源,Message是消息本身,后續(xù)是消息的處理邏輯

  • 多種消息的模式匹配,file_server的代碼中可以看見,receive部分有多種模式,不同消息會進入到不同的處理代碼中,于是這兒的模式是這樣的。

    receive
        Parttern1 ->
            Actions1;
        Parttern2 ->
            Actions2
    %模式之間以;分隔,最后一種模式后面不能寫;
    
  • 循環(huán),Erlang是一種函數(shù)是編程語言,這意味著其邏輯結(jié)構(gòu)是由一系列的函數(shù)演算構(gòu)成的,和其他函數(shù)式語言類似,Erlang沒有專門的循環(huán)語法,因此循環(huán)是通過遞歸實現(xiàn)的。file_server的代碼中可以看見loop函數(shù)最后遞歸調(diào)用了自己。遞歸代碼總會有遞歸棧占用過大的問題,編寫成尾遞歸可以借由編譯器的尾遞歸優(yōu)化解決這一問題。

上述內(nèi)容已經(jīng)涵蓋了erlang的基本知識,可以繼續(xù)寫出下面的file_client模塊

%file_client.erl
-module(file_client).
-export([ls/1, get_file/2, put_file/3]).

ls(Server) ->
    Server ! {self(), list_dir},
    receive
        {Server, FileList} ->
            FileList
    end.

get_file(Server, File) ->
    Server ! {self(), {get_file, File}},
    receive
        {Server, Content} ->
            Content
    end.

put_file(Server, File, Content) ->
    Server ! {self(), put_file, File, Content}},
    receive
        {Server, Result} ->
            Result
    end.

file_client.el中沒有引入新的內(nèi)容,在shell中運行即可看見運行結(jié)果

$ erl
1> c(file_server).
{ok, file_server}
2> c(file_client).
{ok, file_client}
3> FS = file_server:start(".").
<0.45.0> 這是FS這個進程的pid
4> file_client:ls(FS).
{ok,["file_client.beam","file_client.erl",
     "file_server.beam","file_server.erl","hello.erl"]}
5> file_client:get_file(FS, "hello.erl").
{ok,<<"-module(hello).\n-export([start/0]).\n\nstart() ->\n    io:format(\"Hello World!~n\").\n">>}
6> file_client:put_file(FS, "haha", "hehe").
ok
7> file_client:ls(FS).
{ok,["afile_client.beam","afile_client.erl",
     "afile_server.beam","afile_server.erl","haha","hello.erl"]}
8> file_client:get_file(FS, "haha").
{ok,<<"hehe">>}

上述的file_server,file_client,涵蓋了Erlang的基本語法,模式。下一篇文章會講述Erlang語言在編寫傳統(tǒng)順序程序時的用法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內(nèi)容