如果一種編程語言只能通過 shell 來運行代碼,那么這種語言基本上沒什么太大的用處,Erlang 同樣可以通過腳本來運行程序。這里有一小段 Erlang 程序。使用合適的文本編輯器將其輸入到文件 tut.erl 中。文件名稱必須為 tut.erl 不能任意修改,并且需要將其放置于你啟動 erl 命令時所在的目錄下。如果恰巧你的編輯器有 Erlang 模式的話,那么編輯器會幫助你優(yōu)雅地組織和格式化你的代碼 (參考 Emacs 的 Erlang 模式),不過即使你沒有這樣的編輯器你也可以很好地管理你自己的代碼。下面是待輸入的代碼:
-module(tut).
-export([double/1]).
double(X) ->
2 * X.
很容易就可以看出來這個程序?qū)?shù)值翻倍。開始兩行的代碼稍后會解釋。讓我們來編譯一下這段代碼。我們可以在 Erlang shell 下來完成這個任務(wù),其中 c 代表編譯(compile)的意思:
3> c(tut).
{ok,tut}
{ok,tut} 說明編譯成功。如果返回 “error” 則表示輸入的代碼中存在錯誤。其它相關(guān)的錯誤信息可以幫助你弄清楚錯誤的位置和原因,然后你可以根據(jù)錯誤提示修改并重新編譯代碼。
下面運行這個程序:
4> tut:double(10).
20
和預(yù)期結(jié)果一樣,10 乘以 2 后就是 20。
讓我們先回到代碼最開始的這兩行。每個的 Erlang 程序的文件都包含一個 Erlang 模塊。模塊中代碼的第一個行就是該模塊的名字(參見 模塊)。
-module(tut).
因此,這個模塊名為 tut。請注意該行代碼結(jié)束后的句號 “.”。存儲模塊的文件必須與模塊同名,并且以 “.erl” 作為擴展。在這個例子中,文件名為 tut.erl。如果使用到另外一個模塊中的一個函數(shù),可以使用如下的語法 :module_name:function_name(arguments)。因此,下面的代碼的含義也就是調(diào)用模塊 tut 中的函數(shù) double,并且傳遞的實參為 10。
4> tut:double(10).
第二行聲明 tut 模塊中包含一個 double 函數(shù),此函數(shù)接受一個參數(shù) (在本例中為 x):
-export([double/1]).
同時,第二行聲明也說明了這個函數(shù)可以在 tut 模塊外被其它模塊調(diào)用。后面會詳細(xì)說明這一點。請再次注意這一行末尾的句號。
接下來給出一個更加復(fù)雜的例子,計算一個數(shù)的階乘。比如,4 的階乘即為 432*1,等于 24。
在 tut1.erl 文件中輸入如下的一段代碼:
-module(tut1).
-export([fac/1]).
fac(1) ->
1;
fac(N) ->
N * fac(N - 1).
所以在模塊 tut1 中存在一個函數(shù) fac,此函數(shù)接受一個輸入?yún)?shù) N。
第一部分說明的是 1 的階乘即為 1:
fac(1) ->
1;
需要注意的是,這一部分是以分號結(jié)束的,這也就表示后面還有 fac 函數(shù)的更多內(nèi)容。
第二部分表示 N 的階乘為 N 乘以 N-1 的階乘:
fac(N) ->
N * fac(N - 1).
與前面不同,這部分是以句號結(jié)尾的。這也就是說,后面沒有這個函數(shù)更多的內(nèi)容了。
編譯這個文件:
5> c(tut1).
{ok,tut1}
下面計算 4 的階乘:
6> tut1:fac(4).
24
調(diào)用 tut1 模塊中的 fac 函數(shù),傳入的參數(shù)為 4。
與其它語言一樣,Erlang 函數(shù)也可以有多個參數(shù),讓我們擴展 tut1 模塊,實現(xiàn)一個函數(shù)完成兩個數(shù)相乘:
-module(tut1).
-export([fac/1, mult/2]).
fac(1) ->
1;
fac(N) ->
N * fac(N - 1).
mult(X, Y) ->
X * Y.
需要注意,擴展模塊時,需要修改 -export 這一行。在這一行中添加另外一個接受兩個參數(shù)的函數(shù) mult。
編譯:
7> c(tut1).
{ok,tut1}
使用一下新函數(shù):
8> tut1:mult(3,4).
12
在這個例子中,數(shù)字是整數(shù)值,代碼中函數(shù)的參數(shù) N、X 與 Y 被稱之為變量。變量必須以大寫字母開始 (參考變量)。諸如,Number、ShoeSize 和 Age 都是變量。