<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 403, comments - 310, trackbacks - 0, articles - 7
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Erlang的Hello World: 一個計數程序

    Posted on 2008-10-17 20:05 ZelluX 閱讀(1901) 評論(0)  編輯  收藏 所屬分類: Laboratory
    acm queue 9月的雜志的主題是The Concurrency Problem,力推了Erlang這個語言,其中有篇文章簡單的介紹了下這個message-oriented語言。

    查了下這個名字的讀法,正確的讀法應該是air-lang,這里元音a的發音和bang中的a一樣。

    文章中的第一個程序就有點令人費解,主要原因在于Erlang的語法和一般的imperative language差別很大,和functional language比較類似,但是本質上也有很大的不同。

    以Java的一個計數程序為例
    //?A?shared?counter.
    public?class?Sequence?{
    ????
    private?int?nextVal?=?0;
    ?
    ????
    //?Retrieve?counter?and?increment.
    ????public?synchronized?int?getNext()?{
    ????????
    return?nextVal++;
    ????}
    ?
    ????
    //?Re-initialize?counter?to?zero.
    ????public?synchronized?void?reset()?{
    ????????nextVal?
    =?0;
    ????}
    }

    這個程序的功能不用多說了,一個同步的計數程序。它的Erlang翻譯版的代碼為

    -module(sequence1).
    -export([make_sequence/0, get_next/1, reset/1]).
    ?
    % Create a new shared counter.
    make_sequence() ->
    spawn(fun() -> sequence_loop(0)end).
    ?
    sequence_loop(N) ->
    receive
    {From, get_next} ->
    From!{self(), N},
    sequence_loop(N + 1)<SEMI>
    reset ->
    sequence_loop(0)
    end.
    ?
    % Retrieve counter and increment.
    get_next(Sequence) ->
    Sequence!{self(), get_next},
    receive
    {Sequence, N} -> N
    end.
    ?
    % Re-initialize counter to zero.
    reset(Sequence) ->
    Sequence! reset.

    初看這個程序自然是一頭霧水,不過程序的函數式風格味還是很濃的。

    前面提到,Erlang是基于message的,或者說message sending機制是包含在語言系統內部的,語法就是 pid ! message

    接下來再來分析這個簡單的程序。開頭兩行是模塊和函數聲明,略去。make_sequence開始這個進程,spawn/1內置函數創建一個新的進程,并返回pid到調用者。

    初始時運行的函數是sequence_loop(0),這個函數接收兩種信息,用receive表達式聲明:如果收到形式是{From, get_next}的信息,就返回當前的N并調用sequence_loop(N+1),這樣下一次收到同樣的信息時就能返回N+1了;reset則等價 于Java版本中的n=0語句。

    get_next/1則是發送給pid為Sequence的進程 {self(), get_next} 這樣一個信息,上面解釋的sequence_loop/1函數收到這個信息后會返回一個 {self(), N} 的tuple給get_next/1,收到這個信息后get_next/1就能返回N這個值了。

    最后reset/1函數則是發送給Sequence一個reset信息。

    這個簡單的程序里能大致窺見一些Erlang的特點,尤其是它基于信息發送的本質。

    主站蜘蛛池模板: 亚洲日韩一中文字暮| 亚洲成无码人在线观看| 免费精品国产自产拍在线观看| 成人au免费视频影院| 最新亚洲卡一卡二卡三新区| 四虎影视大全免费入口| 亚洲AV无码成人精品区狼人影院 | 无码A级毛片免费视频内谢| 亚洲成AV人片一区二区密柚| 一区二区三区观看免费中文视频在线播放 | 成全在线观看免费观看大全| 亚洲日韩乱码中文无码蜜桃臀网站| 精品无码一级毛片免费视频观看| 亚洲人成网77777亚洲色| 久9久9精品免费观看| 亚洲美免无码中文字幕在线| 亚洲性日韩精品一区二区三区| 四虎国产精品成人免费久久 | 免费毛片在线播放| 边摸边脱吃奶边高潮视频免费| 亚洲国产av无码精品| a级毛片在线免费观看| 亚洲福利视频一区二区三区| 成年人视频在线观看免费| 亚洲av永久无码精品秋霞电影影院 | 一级做a爰片久久免费| 亚洲国产精品久久| 成全高清在线观看免费| 亚洲精品国产免费| 国产精品麻豆免费版| 伊人久久大香线蕉免费视频| 亚洲国产成人精品无码一区二区| 日韩一区二区在线免费观看| 99久久成人国产精品免费| 亚洲1234区乱码| 不卡精品国产_亚洲人成在线| 亚洲高清免费在线观看| 黄色网页免费观看| 亚洲电影在线播放| 亚洲国产高清在线一区二区三区 | 精品亚洲成α人无码成α在线观看 |