<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Erlang的Hello World: 一個(gè)計(jì)數(shù)程序

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

    查了下這個(gè)名字的讀法,正確的讀法應(yīng)該是air-lang,這里元音a的發(fā)音和bang中的a一樣。

    文章中的第一個(gè)程序就有點(diǎn)令人費(fèi)解,主要原因在于Erlang的語(yǔ)法和一般的imperative language差別很大,和functional language比較類(lèi)似,但是本質(zhì)上也有很大的不同。

    以Java的一個(gè)計(jì)數(shù)程序?yàn)槔?br />
    //?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;
    ????}
    }

    這個(gè)程序的功能不用多說(shuō)了,一個(gè)同步的計(jì)數(shù)程序。它的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.

    初看這個(gè)程序自然是一頭霧水,不過(guò)程序的函數(shù)式風(fēng)格味還是很濃的。

    前面提到,Erlang是基于message的,或者說(shuō)message sending機(jī)制是包含在語(yǔ)言系統(tǒng)內(nèi)部的,語(yǔ)法就是 pid ! message

    接下來(lái)再來(lái)分析這個(gè)簡(jiǎn)單的程序。開(kāi)頭兩行是模塊和函數(shù)聲明,略去。make_sequence開(kāi)始這個(gè)進(jìn)程,spawn/1內(nèi)置函數(shù)創(chuàng)建一個(gè)新的進(jìn)程,并返回pid到調(diào)用者。

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

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

    最后reset/1函數(shù)則是發(fā)送給Sequence一個(gè)reset信息。

    這個(gè)簡(jiǎn)單的程序里能大致窺見(jiàn)一些Erlang的特點(diǎn),尤其是它基于信息發(fā)送的本質(zhì)。

    主站蜘蛛池模板: 亚洲自偷自偷偷色无码中文| 亚洲AV综合色一区二区三区| 国产精品自拍亚洲| 亚洲午夜精品第一区二区8050| 免费无码作爱视频| 亚洲一区在线免费观看| 亚洲另类激情专区小说图片| 久久国产精品萌白酱免费| 2020亚洲男人天堂精品| 久久久久亚洲AV无码专区桃色| 国产成人精品免费视频动漫| 美女无遮挡免费视频网站| 亚洲男人第一av网站| 国产精品免费电影| 人妻无码久久一区二区三区免费| 亚洲色偷精品一区二区三区 | 久久亚洲综合色一区二区三区 | 特级精品毛片免费观看| 亚洲一区二区无码偷拍| 亚洲成AV人在线观看天堂无码| 成年性羞羞视频免费观看无限| a国产成人免费视频| 亚洲gay片在线gv网站| 亚洲综合综合在线| 亚洲精品WWW久久久久久| 最近免费中文字幕大全视频| 三年片在线观看免费| 美女又黄又免费的视频| 亚洲资源最新版在线观看| 亚洲国产精品一区第二页 | 一级中文字幕乱码免费| 国产成人精品日本亚洲专区6| 日本红怡院亚洲红怡院最新| 好爽好紧好大的免费视频国产| 182tv免费视视频线路一二三| 久久国产免费直播| 久久亚洲AV成人无码国产电影 | 亚洲欧洲一区二区| 激情97综合亚洲色婷婷五| 国产一区二区三区免费在线观看| 国产成人精品免费午夜app |