Erlang String其實就是List,所以下面三者雖然寫法不同,但意義完全相同。
[65, 66, 67]
[$A, $B, $C]
"ABC"
Erlang的字串使用Latin-1(ISO-8859-1),能表示的字元相當有限。REBOL的字串使用Unicode,可以表示任何國家的文字。
* Un-bind
Erlang有一個函數f(),可以用來將所有的binding解除。REBOL不具有這樣的函數。
Erlang:
> X = 10.
10
> X.
10
> f().
> X.
* 1: veriable 'X' is unbound
*副檔名(file extension)
Erlang源碼使用的副檔名為.erl;REBOL則是.r。Erlang編譯後的模組檔名為.beam;REBOL不需要編譯。你可以使用c()函數來編譯Erlang模組。
*模組定義
Erlang和REBOL都可以定義模組。
Erlang在源碼檔案前這麼寫:
-module(geometry).
-export([area/1]).
-vsn(1234).
REBOL在源碼檔案前這麼寫:
對Erlang來說,沒有被匯出者,無法在別的地方使用。但是對REBOL來說,即時沒有被匯出,依然可以在其他地方被使用,只要註明模組為何即可,例如:
REBOL [
Name: geometry
Version: 1.0.0
Type: module
Export: [area-rect area-circle]
]
my-module/non-exported-word
* 函數與Clause
Erlang的函數可以包含許多Clause。Clause之間用英文分號隔開,最後一個Clause用英文句號結束。例如:
area({rectangle, Width, Ht}) -> Width * Ht;
area({circle, R}) -> 3.14159 * R * R.
呼叫函數的時候會先進行模式比對(Pattern Matching),找出適合的Clause呼叫。
REBOL不具有Clause的概念。上面的程式要改寫成:
Area-Rect: func [ Width Ht ] [ Width * Ht ]
Area-Circle: func [ R ] [ 3.14159 * R * R ]
* 編譯與呼叫模組
Erlang程式要編譯成模組才能執行,你可以使用c()函數來編譯Erlang模組。呼叫某Erlang模組的某函數時,使用英文冒號當作模組和函數之間的分隔符號。
Erlang:
1> c(geometry).
{ok,geometry}
2> geometry:area({rectangle, 10, 5}).
50
3> geometry:area({circle, 1.4}).
6.15752
你也可以利用下面的方式,將模組匯入(import),就可不用在呼叫函數時前面冠上模組名稱和冒號:
-import(geometry, [area/1])
area({rectangle, 10, 5})
REBOL不需要編譯。可以利用import將模組匯入。呼叫函數時,可以用implicit的方式(不註明模組),也可以用explicit的方式(註明模組,用斜線當分隔符號)
mod: import ' geometry
area-rect 10 20
mod/area-rect 10 20
沒有留言:
張貼留言