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