感受 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 的文法非常簡單明瞭。