2008年4月16日

Erlang VS. REBOL, Part V

* List Comprehension
Erlang支援List Comprehension;REBOL雖然沒有List Comprehension,但是要設計一個方言來達到List Comprehension,應該不難。

Erlang:

> L = [1,2,3,4,5]
> [2*X || X <- L]
[2,4,6,8,10]

下面是另一個例子,利用List Comprehension寫出簡短的Quick Sort:
lib_misc.erl
lib_misc.erl
qsort([]) -> [];
qsort([Pivot|T]) ->
qsort([X || X <- T, X < Pivot])
++ [Pivot] ++
qsort([X || X <- T, X >= Pivot]).

1> L=[23,6,2,9,27,400,78,45,61,82,14].
[23,6,2,9,27,400,78,45,61,82,14]
2> lib_misc:qsort(L).
[2,6,9,14,23,27,45,61,78,82,400]


再來一個例子:

lib_misc.erl
perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
> lib_misc:perms("123").
["123","132","213","231","312","321"]
> lib_misc:perms("cats").
["cats", "cast", "ctas", "ctsa", "csat", "csta", "acts", "acst", "atcs", "atsc", "asct", "astc", "tcas", "tcsa", "tacs", "tasc", "tsca", "tsac", "scat", "scta", "sact", "satc", "stca", "stac"]


List Comprehension的語法之簡潔,威力之強大,實在有一點恐怖。

* 等於
Erlang的等於符號是「=:=」與「==」;REBOL的等於符號是「=」與「==」。

* Bitwise運算子
Erlang具有下列的Bitwise運算子bnot、band、bor、bxor、bsl、bsr;REBOL不具有bitwise運算子,但有某些型別和函數具有類似功能,例如logic!型別、shift函數。

* Short-Circuit運算子
Erlang具有orelse和andalso這兩個short-circuit運算子。REBOL的AND和OR則「不是」Short-Circuit,但ANY和ALL可以達到Short-Circuit的效果。

* Guard
Erlang某些地方可以用到Guard,以補模式比對的不足。Guard的運算結果為true或false。

REBOL沒有模式比對的概念,所以沒有Guard。

*Record
Erlang利用Record來模擬物件,Record其實就是Tuple,只是每個元素都有對應的名稱。REBOL的Object和Erlang的Record很類似。

定義record時利用「-record」命令。存放Record定義的檔案,副檔名為.hrl。下面是一個範例:
Records.hrl
-record(todo, {status=reminder,who=jerry,text}).

上面的檔案定義了一個todo記錄結構,使用rr函數(read record)可以將它載入:
> rr("records.hrl").

建立的方式:
> X=#todo{}.
#todo{status = reminder,who = joe,text = undefined}
> X1 = #todo{status=urgent, text="Fix errata in book"}.
#todo{status = urgent,who = joe,text = "Fix errata in book"}
> X2 = X1#todo{status=done}.
#todo{status = done,who = joe,text = "Fix errata in book"}
> X2#todo.text.
"Fix errata in book"

沒有留言: