青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

教父的告白
一切都是紙老虎
posts - 82,  comments - 7,  trackbacks - 0

   讀erlang.org上面的Erlang Course四天教程
1.數字類型,需要注意兩點
1)B#Val表示以B進制存儲的數字Val,比如

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

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

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

3.另一個概念——Tuple,有人翻譯成元組,可以理解成定長數組,是Erlang的基礎數據結構之一:

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  


內置函數size求長度,元組可以嵌套元組或者其他結構。下面所講的列表也一樣。

4.另外一個基礎數據結構就是各個語言都有的list(列表),在[]內以,隔開,可以動態改變大小,

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


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

5.通過這兩個數據結構可以組合成各種復雜結構,與Lisp的cons、list演化出各種結構一樣的奇妙。

6.Erlang中變量有兩個特點:
1)變量必須以大寫字母開頭
2)變量只能綁定一次,或者以一般的說法就是只能賦值一次,其實Erlang并沒有賦值這樣的概念,=號也是用于驗證匹配。

7.模式匹配——Pattern Matching,Erlang的模式匹配非常強大,看了buaawhl的《Erlang語法提要》的介紹,模式匹配的功能不僅僅在課程中介紹的數據結構的拆解,在程序的分派也扮演重要角色,或者說Erlang的控制的流轉是通過模式匹配來實現的。具體功能參見鏈接,給出書中拆解列表的例子:

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  

 
下面會給出更多模式匹配的例子,給出一個模塊用來計算列表等

8.Erlang中函數的定義必須在一個模塊內(Module),并且模塊和函數的名稱都必須是atom,函數的參數可以是任何的Erlang類型或者數據結構,函數要被調用需要從模塊中導出,函數調用的形式類似:
moduleName:funcName(Arg1,Arg2,...).
寫我們的第一個Erlang程序,人見人愛的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中執行:

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


打印出來了,現在解釋下程序構造,

java 代碼
  1. -module(helloWorld).  


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

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


而這一行聲明導出的函數,run/1指的是有一個參數的run函數,因為Erlang允許定義同名的有不同參數的多個函數,通過指定/1來說明要導出的是哪個函數。
接下來就是函數定義了:

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


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

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


9.內置的常用函數:

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.常見Shell命令:
1)h(). 用來打印最近的20條歷史命令
2)b(). 查看所有綁定的變量
3) f(). 取消(遺忘)所有綁定的變量。
4) f(Val).  取消指定的綁定變量
5) e(n).   執行第n條歷史命令
6) e(-1).  執行上一條shell命令

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

java 代碼
 
  1. number(X)    - X 是數字  
  2. integer(X)    - X 是整數  
  3. float(X)    - X 是浮點數  
  4. atom(X)        - X 是一個atom  
  5. tuple(X)    - X 是一個元組  
  6. list(X)        - X 是一個列表  
  7.   
  8. length(X) == 3    - X 是一個長度為3的列表  
  9. size(X) == 2    - X 是一個長度為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規定如下的比較順序:

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



12.忘了介紹apply函數,這個函數對于熟悉javascript的人來說很親切,javascript實現mixin就得靠它,它的調用方式如下:

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

13.if和case語句,if語句的結構如下:
java 代碼
 
  1. if  
  2.    Guard1 ->  
  3.         Sequence1 ;  
  4.    Guard2 ->  
  5.         Sequence2 ;  
  6. ...  
  7. end  

而case語句的結構如下:
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語句都有一個問題,就是當沒有模式匹配或者Grard都是false的時候會導致error,這個問題case可以增加一個類似java中default的:

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


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

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


一樣的道理。case語句另一個需要注意的問題就是變量范圍,每個case分支中定義的變量都將默認導出case語句,也就是在case語句結束后可以被引用,因此一個規則就是每個case分支定義的變量應該一致,不然算是非法的,編譯器會給出警告,比如:

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).  


如果執行true分支,變量A和變量B都被定義,而如果執行的false分支,只有變量B被引用,可在case語句執行后,h(A)調用了變量A,這是不安全的,因為變量A完全可能沒有被定義,編譯器將給出警告
variable 'A' unsafe in 'case' (line 10)



14.給出一些稍微復雜的模型匹配例子,比如用于計算數字列表的和、平均值、長度、查找某元素是否在列表中,我們把這個模塊定義為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.                   


細細體會,利用遞歸來實現,比較有趣。_用于指代任意的變量,當我們只關注此處有變量,但并不關心變量的值的時候使用。用分號;來說明是同一個函數定義,只是不同的定義分支,通過模式匹配來決定調用哪個函數定義分支。
另一個例子,計算各種圖形的面積,也是課程中給出的例子:

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. %計算正方形面積,參數元組的第一個匹配square      
  6. area({square, Side}) ->  
  7.     Side * Side;  
  8. %計算圓的面積,匹配circle    
  9. area({circle, Radius}) ->  
  10.    % almost :-)  
  11.    3 * Radius * Radius;  
  12. %計算三角形的面積,利用海倫公式,匹配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}.  


執行一下看看:

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使用%開始單行注釋。

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

<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一区二区三区我不卡| 永久免费精品影视网站| 欧美日韩精品| 久久久亚洲综合| 欧美永久精品| 久久成人这里只有精品| 国产一区二区剧情av在线| 国产欧美视频一区二区| 国产在线精品一区二区夜色| 国内自拍视频一区二区三区| 亚洲国产精品综合| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美在线一区二区| 亚洲第一福利视频| 亚洲人成人77777线观看| 夜夜嗨av一区二区三区网页| 亚洲综合色在线| 久久这里只有| 99国产精品| 久久九九全国免费精品观看| 欧美日韩 国产精品| 国产精品免费一区二区三区在线观看 | 久久久国产精品亚洲一区| 亚洲欧洲日本在线| 99re热这里只有精品免费视频| 99re66热这里只有精品4| 亚洲你懂的在线视频| 久久一二三四| 一本久久知道综合久久| 久久久91精品国产一区二区精品| 欧美顶级大胆免费视频| 国产美女精品| 欧美黄色大片网站| 亚洲婷婷综合色高清在线| 日韩一本二本av| 欧美一级久久| 狂野欧美激情性xxxx欧美| 欧美成人国产一区二区| 国产精品久久久久久亚洲调教| 一色屋精品视频在线观看网站| 曰韩精品一区二区| 欧美日韩一区二区免费在线观看| 国产日产欧产精品推荐色| 99国产精品私拍| 狼人社综合社区| 亚洲一二区在线| 欧美另类高清视频在线| 国语自产精品视频在线看| 一卡二卡3卡四卡高清精品视频| 久久婷婷丁香| 香蕉成人啪国产精品视频综合网| 亚洲在线视频| 欧美色道久久88综合亚洲精品| 亚洲激情网址| 美国十次成人| 久久国产精品一区二区| 国产精品久久久久久久久| 99热在线精品观看| 亚洲国产成人av好男人在线观看| 欧美一区二区三区四区高清| 国产精品爱久久久久久久| 日韩视频一区二区三区在线播放免费观看 | 欧美日韩一区二区在线视频 | 欧美三级日本三级少妇99| 亚洲国产精品一区二区第四页av| 久久久久久久久综合| 亚洲欧美久久久| 国产精品一区二区三区四区| 午夜欧美不卡精品aaaaa| 亚洲视频精选在线| 国产精品视频yy9099| 亚洲综合国产| 亚洲欧美成人一区二区三区| 国产精品一区二区a| 久久成年人视频| 欧美一区亚洲二区| 黄色一区二区在线观看| 欧美福利一区二区三区| 欧美a级片网站| 日韩亚洲欧美精品| 国产精品亚洲综合| 国产精品夜夜夜| 亚洲欧洲日韩在线| 欧美v日韩v国产v| 免费观看不卡av| 亚洲精品网站在线播放gif| 欧美大片va欧美在线播放| 看欧美日韩国产| 亚洲日本va午夜在线电影| 亚洲精品国偷自产在线99热| 国产伦精品一区二区三区免费迷| 一区二区精品国产| 欧美性淫爽ww久久久久无| 久久精品在这里| 久久综合给合久久狠狠色| 一区二区三区四区五区精品视频| 欧美一区二区三区免费观看视频| 久久久久久久精| 欧美在线观看网址综合| 欧美日韩精品一区二区| 一本在线高清不卡dvd| 久久一区中文字幕| 国产一二三精品| 欧美激情一区三区| 国产精品日本欧美一区二区三区| 久久久久成人网| 欧美精品乱码久久久久久按摩| 先锋影音国产一区| 男女激情久久| 久久精彩免费视频| 欧美精品videossex性护士| 一区二区激情小说| 久久久久九九视频| 亚洲一区三区视频在线观看| 久久一区亚洲| 久久五月激情| 国产免费成人| 中文av一区二区| 一本色道久久加勒比88综合| 久久国产一区二区| 亚洲欧美在线高清| 欧美精品色网| 欧美国产三区| 在线观看欧美一区| 亚洲成色最大综合在线| 国产一区久久| 亚洲欧美激情视频在线观看一区二区三区 | 免费在线亚洲欧美| 午夜精品在线| 欧美一区二区三区久久精品茉莉花 | 亚欧成人在线| 欧美激情一区二区三区高清视频 | 国产综合视频| 亚洲女女女同性video| 亚洲欧美日韩网| 欧美性视频网站| 亚洲午夜性刺激影院| 亚洲一区二区三区精品在线| 欧美日本在线一区| 亚洲伦理自拍| 亚洲综合精品四区| 欧美亚州韩日在线看免费版国语版| 亚洲精品永久免费| 一本一本a久久| 国产精品mm| 亚洲欧美激情诱惑| 久久夜色精品国产亚洲aⅴ| 国产综合色产| 蜜臀va亚洲va欧美va天堂| 亚洲国产色一区| 亚洲午夜高清视频| 国产视频精品免费播放| 久久影院午夜片一区| 亚洲人成亚洲人成在线观看| 亚洲视频一二| 国产一区在线看| 欧美成人三级在线| 一区二区三区视频在线看| 久久精品国产视频| 136国产福利精品导航网址| 久色婷婷小香蕉久久| 亚洲激情第一区| 亚洲欧美日本国产有色| 国产精品爱久久久久久久| 久久精品二区三区| 久久亚洲私人国产精品va媚药| 欧美午夜理伦三级在线观看| 亚洲视频狠狠| 久久国产一二区| 国内自拍视频一区二区三区| 欧美激情影院| 在线一区二区日韩| 久久www成人_看片免费不卡| 国产精品久久999| 欧美一区二区三区免费看| 久久久久网址| 亚洲日本无吗高清不卡| 国产亚洲一区二区在线观看| 久久久精品网| 亚洲乱码日产精品bd| 欧美在线观看一区二区| 亚洲精品在线一区二区| 国产精品久久久久91| 性欧美videos另类喷潮| 99日韩精品| 亚洲国产第一| 亚洲国产成人不卡| 91久久夜色精品国产九色| 最新亚洲电影| 欧美精品成人| 国产一区二区三区日韩| 亚洲欧美日韩精品久久久| 欧美日产在线观看| 亚洲午夜激情| 国产欧美日韩精品在线| 一区二区三区|亚洲午夜| 亚洲美女网站| 久久超碰97中文字幕| 国产亚洲欧美一区| 亚洲精品专区|