感受 Erlang(1)

來源:互聯網
上載者:User
Erlang 的學習感受Erlang 是個好東西,並發控制、容錯機制、分布應用,……,簡直是個進階實用技術倉庫。在它適用的領域裡,Erlang 有著獨步天下的優勢,至今沒有別的語言工具能與它叫板抗衡。最近,開始學習 Erlang,看了幾天的e教材後,有些相見恨晚的感歎。為了提醒備忘,把一些收穫感受寫下來。一、怎樣快速入門現在,從網上能很容易地找到一大堆 Erlang 的中英文資料。雖說開卷有益,但我覺得最好的入門教材,是 Erlang 內建的 doc,即《Getting Started With Erlang》。在學習方法上,按照循序漸進的規律,在入門階段,記憶比理解更重要。首先囫圇吞棗,比著葫蘆畫瓢,瞭解對象的全貌,快速掌握基本內容。然後反覆溫習,攻讀執行個體代碼,深入理解,最後達到熟練、精通。二、Erlang = Prolog + Lisp從基本文法上,Erlang 是 Prolog 和 Lisp 的混合雜交產物。Erlang 誕生地是瑞典。同在斯堪的那維亞半島上的瑞典和丹麥,人工智慧研究頗有名氣,象丹麥的Visual Prolog(前身是PDC Prolog, Turbo Prolog),Hugin(貝葉斯置信網路系統),瑞典的 SICStus Prolog。Erlang 的初始版本是用 Prolog 寫成,與這個背景不無關係。大致粗略地看,在基本文法上,Erlang 與 Prolog 有以下相似之處。● 語句分隔字元是逗號(,),語句(子句、段)結束符是句號(.)● 變數名稱第一個字元必須用大寫字母● 在同一範圍,變數只能一次賦值● 以底線作為匿名變數● 資料類型:atom(原子),以小寫字母開頭,可簡單地看作是沒有引號的字串● 函數子句(clause)及其匹配(match)的概念● 注釋符號相同(%)● 分號(;)在 Prolog 中是邏輯“或”(or)的句段分隔字元,在 Erlang 中大體意思相同● 列表(list)的表達和操作幾乎完全相同● 列表 list 是 prolog 最重要的資料結構,在 erlang 中似乎也是● 同名函數(子句)以形參數目相區別● 都使用子句匹配的遞迴迴圈,都沒有 for、while 迴圈方式從詞法、句法、章法上,erlang 的文法相似於 prolog。詞法:變數首字母大寫;句法:子句;章法:子句匹配,遞迴迴圈。Erlang 與 Lisp 相似之處,即它具有的函數語言的特徵。● 子句分成首體 2 部分,符號(->)前面的是子句頭,後面的是子句體● 有 lambda 高階函數文法機制Erlang 雖然同時具備 Prolog 和 lisp 的特徵,但主要的、大部分的特徵更象 Prolog。因此,把 Erlang 當做邏輯式函數語言,會更有利於對它的理解掌握。三、對 Erlang 實用化的理解對許多人來說,Erlang 的文法(包括詞法、句法、章法)有些怪異。這是因為 Erlang 的編程方式,基本上是“說明式”的,不是人們熟悉的“過程式”的。解決這個困難問題的辦法之一,是對 Erlang 作“過程式”的解釋。以計算階乘的函數子句為例:fac(1) ->    1;fac(N) ->    N * fac(N - 1).做點修改可能看得更清楚些:fac(1) ->    1;fac(N) ->    M = fac(N - 1),    N * M.它的本意是:如果參數值為1,返回 1;否則,求出 N - 1 的階乘 M,返回 N 與 M 的乘積。其實,Erlang 子句的結構形式,與 Prolog 一樣,具有邏輯編程的意義,在符號 -> 前面的是測試判斷的條件,後面的是測判後的操作行為結果。分號(;)在此是or(否則)的意思。由於第二個子句是遞迴迴圈,於是,第一子句也是遞迴迴圈終止的限制條件。翻譯成 c 語言程式,代碼是這樣的:int fac( n ){    if (n==1)        return (n);    else         return (n * fac(n - 1));}以上是2個子句一組的函數,構成 if-then-else 的邏輯關係。Erlang 也有1個子句的函數,表示 if-then 的關係。如:start() ->    spawn(tut14, say_something, [hello, 3]),    spawn(tut14, say_something, [goodbye, 3]).這種沒有形參的函數,相當於 if true then: 的無條件執行,即“過程式”函數。對於 if-then-else 嵌套的邏輯,Erlang 是這樣處理的:● guard 機制。如:list_max([], Res) ->    Res;list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->    list_max(Rest, Head);list_max([Head|Rest], Result_so_far)  ->    list_max(Rest, Result_so_far).第2子句首部多了個 when 測試。它實際上是 if 判斷,邏輯行為如下:if (Head > Result_so_far)    執行本子句(第2子句)中的語句;else    執行函數的第3子句;● if 機制,case 機制。如:month_length(Year, Month) ->    Leap = if        trunc(Year / 400) * 400 == Year ->            leap;        trunc(Year / 100) * 100 == Year ->            not_leap;        trunc(Year / 4) * 4 == Year ->            leap;        true ->            not_leap    end,      case Month of        sep -> 30;        apr -> 30;        jun -> 30;        nov -> 30;        feb when Leap == leap -> 29;        feb -> 28;        jan -> 31;        mar -> 31;        may -> 31;        jul -> 31;        aug -> 31;        oct -> 31;        dec -> 31    end.總之,以上大致是 Erlang 基本文法的主要內容。應該說,Erlang 的文法非常簡單明瞭。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.