Erlang

Erlang是Erlang的常用執行環境及一系列標準元件。Erlang 執行環境為專有以下要求的系統設計：Erlang是運作於虛擬機器的程式結構以函式定義為主。函式是一組將輸入分別對應到輸出的規則，對應方式遵守數學函式的慣例。此外，Erlang語言由幾項構句要素所組成，包括文字(或稱原子)、數字、列表、值組、字元、字串、二進位資料、模組、與特定用途的關鍵字如fun ... end, if ... end, case ... of ... end, spawn, !, receive ... end等等。以下段落分別列示並舉例說明Erlang程式的基本構成部份，涵蓋資料格式、表示式格式與內建函式。內建函式.開源電信平臺包括一個Erlang直譯器、一個Erlang編譯器、程式節點通訊協定、CORBA、一個分散式資料庫Mnesia{{Wayback|url=http://en.wikipedia.org/wiki/Mnesia |date=20100305050923 }}、以及許多程式庫。內建函式涵蓋了各種方面的功能，涵蓋了系統命令、資料存取、格式轉換、網路通訊、圖形介面、 ... 等。以下列表介紹幾項常用的Erlang內建函式。(案{{Wayback|url=http://www.erlang.org/doc/ |date=20100612213537 }}或索引 {{Wayback|url=http://www.erlang.org/doc/man_index.html |date=20220315092402 }})Hello World 程式.這是輸出 Hello World 的一種方式：-module(hello).-export([hello_world/0]).hello_world() -&gt; io:fwrite("hello, world\n").若要編譯這個程式，將它存為一個名為 hello.erl 的文字檔，然後從 Erlang終端 進行編譯。不要忘了在每個命令的最後加上一個句號。例如：Erlang (BEAM) emulator version 4.9.1 [source]Eshell V4.9.1 (abort with ^G)1&gt; c(hello).從 Erlang終端 上執行這個程式：2&gt; hello:hello_world().hello, worldok函式式程式設計.Erlang支援函式式程式設計的一般特色，特色包括單次賦值、遞迴定義、λ演算與高階函式等等。Erlang函式大致寫法如下，以整數階乘模組為例：-module(fact).-export([fac/1]).fac(N) when N &gt; 1 -&gt;N * fac(N-1);fac(1) -&gt;1.以下是快速排序演演算法的Erlang實作："%% quicksort:qsort(List)""%% Sort a list of items"-module(quicksort).-export([qsort/1]).qsort([]) -&gt; [];qsort([Pivot|Rest]) -&gt;qsort([ X || X  Pivot]).以下是費氏數列求解函式：-module(example).-export([fibo/1]).fibo(N) when N &gt; 1 -&gt;fibo(N-1) + fibo(N-2);fibo(1) -&gt;1;fibo(0) -&gt;0.&gt; c(example).&gt; lists:map(fun(X)-&gt;example:fibo(X) end, lists:seq(1,10)).[1,1,2,3,5,8,13,21,34,55]函式式程式設計難免以遞迴計算，而消耗了大量遞迴堆疊空間。為了克服這個問題，一般使用累積引數與尾端遞迴等技巧節省遞迴數目：如以下例子。-module(test).-export([fibo_accu/1]).fibo_accu(N) -&gt;fibo(N, 0, 1).fibo(N, C1, C2) when N &gt; 2 -&gt;fibo(N-1, C2, C1+C2);fibo(0, _, _) -&gt;0;fibo(1, _, _) -&gt;1;fibo(_, C1, C2) -&gt;C1+C2.&gt; c(example).&gt; lists:map(fun(X)-&gt;test:fibo_accu(X) end, lists:seq(1,10)).[1,1,2,3,5,8,13,21,34,55]函式式程式設計容許使用高階函式求解。以下例子說明Erlang實做複合函式。 ( f o g ，唸作 f "after" g 。)'After'(F, G) -&gt;fun(X) -&gt;erlang:apply(F, [erlang:apply(G, [X])])end.* 請注意after是Erlang關鍵字。因此，以上函式命名為′"After"′避開關鍵字。&gt; (example:'After'(fun test:show/1, fun test:parse/1))(3.1416).Real number 3.141600 is met.ok平行式程式設計.Erlang最主要的特色是平行導向程式設計，強調多程式平行運作，並且以訊息對彼此溝通。Erlang提供了spawn函式和 ! 、 receive ... end 等關鍵字，可以描述在Erlang/開源電信平臺中的如何啟動一些程式、並且如何讓程式傳遞訊息。此外，平行導向程式設計的精神還強調程式的容錯處理，藉由程式發生錯誤時的訊息傳遞，使其他程式可以得知錯誤的發生，使方便於後續處理。以下分別介紹平行導向程式設計的一般程式撰寫方式，以及錯誤處理的使用方式。平行導向程式設計.基本的平行程式示範如下："% create process and call the function web:start_server(Port, MaxConnections)"ServerProcess = spawn(web, start_server, [Port, MaxConnections]),"% send the {pause, 10} message (a tuple with an atom "pause" and a number "10")""% to ServerProcess (asynchronously)"ServerProcess ! {pause, 10},"% receive messages sent to this process"receivea_message -&gt; do_something;{data, DataContent} -&gt; handle(DataContent);{hello, Text} -&gt; io:format("Got hello message: ~s", [Text]);{goodbye, Text} -&gt; io:format("Got goodbye message: ~s", [Text])end.收到 "a_message" 結果就是 "do_something" ；收到 {"data", "DataContent"} 結果會呼叫 handle(DataContent) ；收到 {"hello", "Text"} 結果教是印出 "Got hello message: ..." ，收到 {"goodbye", "Text"} 結果是印出"Got goodbye message: ..." 。以下程式，示範產生一組環狀傳遞訊息的程式。ring_proc(Funs) -&gt;Ns = lists:seq(1, length(Funs)),[P|Pids] = [ spawn("?MODULE", lists:nth(Nth,Funs),[]) || Nth alt(number(),xthen(literal($(), thenx(expr(), literal($)))))end.|first=Joe|last=Armstrong|first2=Robert|last2=Virding|first3=Mike|last3=Williams|first4=Claes|last4=Wikstrom|title=Concurrent Programming in Erlang|publisher=Prentice Hall|edition=2nd|date=1996-01-16|page=358|isbn=978-0-13-508301-7|url=http://www.erlang.org/erlang_book_toc.html|archive-url=https://web.archive.org/web/20120306002430/http://www.erlang.org/erlang_book_toc.html|archive-date=2012-03-06|access-date=2019-10-16|dead-url=yes|first=Joe|last=Armstrong|title=Programming Erlang: Software for a Concurrent World|publisher=Pragmatic Bookshelf|edition=1st|date=2007-07-11|page=536|isbn=978-1-934356-00-5|url=https://archive.org/details/programmingerlan0000arms|url-access=registration|first=Simon J.|last=Thompson|first2=Francesco|last2=Cesarini|title=Erlang Programming: A Concurrent Approach to Software Development|publisher=O'Reilly Media, Inc.|edition=1st|date=2009-06-19|page=496|location=Sebastopol, California|isbn=978-0-596-51818-9|url=http://www.erlangprogramming.org|access-date=2020-01-20|archive-url=https://web.archive.org/web/20191016135454/http://www.erlangprogramming.org/|archive-date=2019-10-16|dead-url=yes|first=Martin|last=Logan|first2=Eric|last2=Merritt|first3=Richard|last3=Carlsson|title=Erlang and OTP in Action|publisher=Manning Publications|edition=1st|date=2010-05-28|page=500|location=Greenwich, CT|isbn=978-1-933988-78-8|url=|last=Martin|first=Brown|title=Introduction to programming in Erlang, Part 1: The basics|work=developerWorks|publisher=IBM|date=2011-05-10|url=http://www.ibm.com/developerworks/opensource/library/os-erlang1/index.html|access-date=2011-05-10|archive-date=2019-10-16|archive-url=https://web.archive.org/web/20191016122316/https://www.ibm.com/developerworks/opensource/library/os-erlang1/index.html|dead-url=no|last=Martin|first=Brown|title=Introduction to programming in Erlang, Part 2: Use advanced features and functionality|work=developerWorks|publisher=IBM|date=2011-05-17|url=http://www.ibm.com/developerworks/opensource/library/os-erlang2/index.html|access-date=2011-05-17|archive-date=2019-10-16|archive-url=https://web.archive.org/web/20191016122340/https://www.ibm.com/developerworks/opensource/library/os-erlang2/index.html|dead-url=no|last=Wiger|first=Ulf|title=Four-fold Increase in Productivity and Quality: Industrial-Strength Functional Programming in Telecom-Class Products|work=FEmSYS 2001 Deployment on distributed architectures|publisher=Ericsson Telecom AB|date=2001-03-30|url=http://www.erlang.se/publications/Ulf_Wiger.pdf|access-date=2014-09-16|archive-date=2019-08-19|archive-url=https://web.archive.org/web/20190819130310/http://www.erlang.se/publications/Ulf_Wiger.pdf|dead-url=no