• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            教父的告白
            一切都是紙老虎
            posts - 82,  comments - 7,  trackbacks - 0

               讀erlang.org上面的Erlang Course四天教程
            1.數(shù)字類型,需要注意兩點(diǎn)
            1)B#Val表示以B進(jìn)制存儲(chǔ)的數(shù)字Val,比如

            ruby 代碼
             
            1. 7> 2#101.  
            2. 5  

            進(jìn)制存儲(chǔ)的101就是10進(jìn)制的5了
            2)$Char表示字符Char的ascii編碼,比如$A表示65

            2.比較難以翻譯的概念——atom,可以理解成常量,它可以包含任何字符,以小寫字母開(kāi)頭,如果不是以小寫字母開(kāi)頭或者是字母之外的符號(hào),需要用單引號(hào)包括起來(lái),比如abc,'AB'

            3.另一個(gè)概念——Tuple,有人翻譯成元組,可以理解成定長(zhǎng)數(shù)組,是Erlang的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)之一:

            ruby 代碼
            1. 8> {1,2,3,4,5}.  
            2. {1,2,3,4,5}  
            3. 9> {a,b,c,1,2}.  
            4. {a,b,c,1,2}  
            5. 10> size({1,2,3,a,b,c}).  
            6. 6  


            內(nèi)置函數(shù)size求長(zhǎng)度,元組可以嵌套元組或者其他結(jié)構(gòu)。下面所講的列表也一樣。

            4.另外一個(gè)基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)就是各個(gè)語(yǔ)言都有的list(列表),在[]內(nèi)以,隔開(kāi),可以動(dòng)態(tài)改變大小,

            python 代碼
             
            1. [123, xyz]  
            2. [123, def, abc]  
            3. [{person, 'Joe', 'Armstrong'},  
            4.     {person, 'Robert', 'Virding'},  
            5.     {person, 'Mike', 'Williams'}  
            6. ]  


            可以使用內(nèi)置函數(shù)length求列表大小。以""包含的ascii字母代表一個(gè)列表,里面的元素就是這些字母的ascii值,比如"abc"表示列表[97,98,99]。

            5.通過(guò)這兩個(gè)數(shù)據(jù)結(jié)構(gòu)可以組合成各種復(fù)雜結(jié)構(gòu),與Lisp的cons、list演化出各種結(jié)構(gòu)一樣的奇妙。

            6.Erlang中變量有兩個(gè)特點(diǎn):
            1)變量必須以大寫字母開(kāi)頭
            2)變量只能綁定一次,或者以一般的說(shuō)法就是只能賦值一次,其實(shí)Erlang并沒(méi)有賦值這樣的概念,=號(hào)也是用于驗(yàn)證匹配。

            7.模式匹配——Pattern Matching,Erlang的模式匹配非常強(qiáng)大,看了buaawhl的《Erlang語(yǔ)法提要》的介紹,模式匹配的功能不僅僅在課程中介紹的數(shù)據(jù)結(jié)構(gòu)的拆解,在程序的分派也扮演重要角色,或者說(shuō)Erlang的控制的流轉(zhuǎn)是通過(guò)模式匹配來(lái)實(shí)現(xiàn)的。具體功能參見(jiàn)鏈接,給出書中拆解列表的例子:

            python 代碼
            1. [A,B|C] = [1,2,3,4,5,6,7]  
            2.      Succeeds - binds A = 1, B = 2,  
            3.      C = [3,4,5,6,7]  
            4.    
            5.  [H|T] = [1,2,3,4]  
            6.      Succeeds - binds H = 1, T = [2,3,4]  
            7.    
            8.  [H|T] = [abc]  
            9.      Succeeds - binds H = abc, T = []  
            10.    
            11.  [H|T] = []  
            12.      Fails  

             
            下面會(huì)給出更多模式匹配的例子,給出一個(gè)模塊用來(lái)計(jì)算列表等

            8.Erlang中函數(shù)的定義必須在一個(gè)模塊內(nèi)(Module),并且模塊和函數(shù)的名稱都必須是atom,函數(shù)的參數(shù)可以是任何的Erlang類型或者數(shù)據(jù)結(jié)構(gòu),函數(shù)要被調(diào)用需要從模塊中導(dǎo)出,函數(shù)調(diào)用的形式類似:
            moduleName:funcName(Arg1,Arg2,...).
            寫我們的第一個(gè)Erlang程序,人見(jiàn)人愛(ài)的Hello World:

            java 代碼
             
            1. -module(helloWorld).  
            2. -export([run/1]).  
            3. run(Name)->  
            4.     io:format("Hello World ~w~n",[Name]).  


            存為helloWorld.erl,在Erlang Shell中執(zhí)行:

            java 代碼
             
            1. 2> c(helloWorld).  
            2. {ok,helloWorld}  
            3. 3> helloWorld:run(dennis).  
            4. Hello World dennis  
            5. ok  


            打印出來(lái)了,現(xiàn)在解釋下程序構(gòu)造,

            java 代碼
            1. -module(helloWorld).  


            這一行聲明了模塊helloWorld,函數(shù)必須定義在模塊內(nèi),并且模塊名稱必須與源文件名相同。

            java 代碼
             
            1. -export([run/1]).  


            而這一行聲明導(dǎo)出的函數(shù),run/1指的是有一個(gè)參數(shù)的run函數(shù),因?yàn)镋rlang允許定義同名的有不同參數(shù)的多個(gè)函數(shù),通過(guò)指定/1來(lái)說(shuō)明要導(dǎo)出的是哪個(gè)函數(shù)。
            接下來(lái)就是函數(shù)定義了:

            java 代碼
             
            1. run(Name)->  
            2.     io:format("Hello World ~w~n",[Name]).  


            大寫開(kāi)頭的是變量Name,調(diào)用io模塊的format方法輸出,~w可以理解成占位符,將被實(shí)際Name取代,~n就是換行了。注意,函數(shù)定義完了要以句號(hào).結(jié)束。然后執(zhí)行c(helloWorld).編譯源代碼,執(zhí)行:

            java 代碼
            1. helloWorld:run(dennis);  


            9.內(nèi)置的常用函數(shù):

            java 代碼
             
            1. date()  
            2. time()  
            3. length([1,2,3,4,5])  
            4. size({a,b,c})  
            5. atom_to_list(an_atom)  
            6. list_to_tuple([1,2,3,4])  
            7. integer_to_list(2234)  
            8. tuple_to_list({})  
            9. hd([1,2,3,4])  %輸出1,也就是列表的head  
            10. tl([1,2,3,4])  %輸出[2,3,4],也就是列表的tail  


            10.常見(jiàn)Shell命令:
            1)h(). 用來(lái)打印最近的20條歷史命令
            2)b(). 查看所有綁定的變量
            3) f(). 取消(遺忘)所有綁定的變量。
            4) f(Val).  取消指定的綁定變量
            5) e(n).   執(zhí)行第n條歷史命令
            6) e(-1).  執(zhí)行上一條shell命令

            11.又一個(gè)不知道怎么翻譯的概念——Guard。翻譯成約束?呵呵。用于限制變量的類型和范圍,比如:

            java 代碼
             
            1. number(X)    - X 是數(shù)字  
            2. integer(X)    - X 是整數(shù)  
            3. float(X)    - X 是浮點(diǎn)數(shù)  
            4. atom(X)        - X 是一個(gè)atom  
            5. tuple(X)    - X 是一個(gè)元組  
            6. list(X)        - X 是一個(gè)列表  
            7.   
            8. length(X) == 3    - X 是一個(gè)長(zhǎng)度為3的列表  
            9. size(X) == 2    - X 是一個(gè)長(zhǎng)度為2的元組  
            10.   
            11. X > Y + Z    - X >Y+Z  
            12. X == Y        - X 與Y相等  
            13. X =:= Y        - X 全等于Y  
            14. (比如: 1 == 1.0 成功  
            15.            1 =:= 1.0 失敗)  


            為了方便比較,Erlang規(guī)定如下的比較順序:

            java 代碼
            1. number < atom < reference < port < pid < tuple < list  



            12.忘了介紹apply函數(shù),這個(gè)函數(shù)對(duì)于熟悉javascript的人來(lái)說(shuō)很親切,javascript實(shí)現(xiàn)mixin就得靠它,它的調(diào)用方式如下:

            apply(Mod, Func, Args),三個(gè)參數(shù)分別是模塊、函數(shù)以及參數(shù)列表,比如調(diào)用我們的第一個(gè)Erlang程序:
            java 代碼
            1. apply(helloWorld,run,[dennis]).  

            13.if和case語(yǔ)句,if語(yǔ)句的結(jié)構(gòu)如下:
            java 代碼
             
            1. if  
            2.    Guard1 ->  
            3.         Sequence1 ;  
            4.    Guard2 ->  
            5.         Sequence2 ;  
            6. ...  
            7. end  

            而case語(yǔ)句的結(jié)構(gòu)如下:
            java 代碼
             
            1. case Expr of  
            2.    Pattern1 [when Guard1] -> Seq1;  
            3.    Pattern2 [when Guard2] -> Seq2;  
            4.   
            5.    PatternN [when GuardN] -> SeqN  
            6. end  

            if和case語(yǔ)句都有一個(gè)問(wèn)題,就是當(dāng)沒(méi)有模式匹配或者Grard都是false的時(shí)候會(huì)導(dǎo)致error,這個(gè)問(wèn)題case可以增加一個(gè)類似java中default的:

            java 代碼
             
            1. case Fn of  
            2.   
            3.    _ ->  
            4.    true  
            5. end  


            通過(guò)_指代任意的Expr,返回true,而if可以這樣:

            java 代碼
             
            1. if  
            2.     
            3.   true ->  
            4.    true  
            5. end  


            一樣的道理。case語(yǔ)句另一個(gè)需要注意的問(wèn)題就是變量范圍,每個(gè)case分支中定義的變量都將默認(rèn)導(dǎo)出case語(yǔ)句,也就是在case語(yǔ)句結(jié)束后可以被引用,因此一個(gè)規(guī)則就是每個(gè)case分支定義的變量應(yīng)該一致,不然算是非法的,編譯器會(huì)給出警告,比如:

            java 代碼
             
            1. f(X) ->  
            2. case g(X) of  
            3. true -> A = h(X), B = A + 7;  
            4. false -> B = 6  
            5. end,  
            6. h(A).  


            如果執(zhí)行true分支,變量A和變量B都被定義,而如果執(zhí)行的false分支,只有變量B被引用,可在case語(yǔ)句執(zhí)行后,h(A)調(diào)用了變量A,這是不安全的,因?yàn)樽兞緼完全可能沒(méi)有被定義,編譯器將給出警告
            variable 'A' unsafe in 'case' (line 10)



            14.給出一些稍微復(fù)雜的模型匹配例子,比如用于計(jì)算數(shù)字列表的和、平均值、長(zhǎng)度、查找某元素是否在列表中,我們把這個(gè)模塊定義為list:

            java 代碼
             
            1. -module(list).  
            2. -export([average/1,sum/1,len/1,double/1,member/2]).  
            3. average(X)->sum(X)/len(X).  
            4. sum([H|T]) when number(H)->H+sum(T);  
            5. sum([])->0.  
            6. len([_|T])->1+len(T);  
            7. len([])->0.  
            8. double([H|T]) -> [2*H|double(T)];  
            9. double([]) -> [].  
            10. member(H, [H|_]) -> true;  
            11. member(H, [_|T]) -> member(H, T);  
            12. member(_, []) -> false.  
            13.                   


            細(xì)細(xì)體會(huì),利用遞歸來(lái)實(shí)現(xiàn),比較有趣。_用于指代任意的變量,當(dāng)我們只關(guān)注此處有變量,但并不關(guān)心變量的值的時(shí)候使用。用分號(hào);來(lái)說(shuō)明是同一個(gè)函數(shù)定義,只是不同的定義分支,通過(guò)模式匹配來(lái)決定調(diào)用哪個(gè)函數(shù)定義分支。
            另一個(gè)例子,計(jì)算各種圖形的面積,也是課程中給出的例子:

            java 代碼
             
            1. -module(mathStuff).  
            2. -export([factorial/1,area/1]).  
            3. factorial(0)->1;  
            4. factorial(N) when N>0->N*factorial(N-1).  
            5. %計(jì)算正方形面積,參數(shù)元組的第一個(gè)匹配square      
            6. area({square, Side}) ->  
            7.     Side * Side;  
            8. %計(jì)算圓的面積,匹配circle    
            9. area({circle, Radius}) ->  
            10.    % almost :-)  
            11.    3 * Radius * Radius;  
            12. %計(jì)算三角形的面積,利用海倫公式,匹配triangle   
            13. area({triangle, A, B, C}) ->  
            14.    S = (A + B + C)/2,  
            15. math:sqrt(S*(S-A)*(S-B)*(S-C));  
            16. %其他  
            17. area(Other) ->  
            18.    {invalid_object, Other}.  


            執(zhí)行一下看看:

            java 代碼
             
            1. 1> c(mathStuff).  
            2. {ok,mathStuff}  
            3. 2> mathStuff:area({square,2}).  
            4. 4  
            5. 3> mathStuff:area({circle,2}).  
            6. 12  
            7. 4> mathStuff:area({triangle,2,3,4}).  
            8. 2.90474  
            9. 5> mathStuff:area({other,2,3,4}).  
            10. {invalid_object,{other,2,3,4}}  


            Erlang使用%開(kāi)始單行注釋。

            posted on 2009-09-11 10:11 暗夜教父 閱讀(549) 評(píng)論(0)  編輯 收藏 引用 所屬分類: erlang

            <2009年9月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品乱码久久久久久夜夜嗨| 中文字幕人妻色偷偷久久| 精品亚洲综合久久中文字幕| 久久免费高清视频| 久久99精品久久久久久齐齐| 日韩精品无码久久一区二区三| 国产成人综合久久精品红| 久久久久亚洲av无码专区导航| 九九99精品久久久久久| 久久只有这里有精品4| 777米奇久久最新地址| 日韩久久久久中文字幕人妻| 精品久久久久久亚洲精品| 女同久久| 无码人妻久久一区二区三区免费| 国产日产久久高清欧美一区| 亚洲午夜久久久| 很黄很污的网站久久mimi色 | 人妻中文久久久久| 99久久精品影院老鸭窝| 久久精品国产亚洲AV香蕉| 69SEX久久精品国产麻豆| 久久久久久国产精品无码下载| segui久久国产精品| 日韩亚洲欧美久久久www综合网| 欧美精品丝袜久久久中文字幕 | 久久精品国产亚洲Aⅴ香蕉| 国产精品美女久久久久| 国产A三级久久精品| 午夜精品久久久久| 伊色综合久久之综合久久| 欧美亚洲日本久久精品| 日韩精品无码久久一区二区三| 曰曰摸天天摸人人看久久久| 精品久久久久久国产潘金莲| 中文字幕人妻色偷偷久久| 久久亚洲精品无码aⅴ大香 | 久久久久国色AV免费看图片 | 国产成人精品久久| 久久水蜜桃亚洲av无码精品麻豆| 久久精品视频一|