鍍金池/ 教程/ 區(qū)塊鏈/ 內(nèi)置函數(shù) (BIF)
注冊進程名稱
錯誤處理
完整示例
分布式編程
消息傳遞
if 與 case
健壯性
映射 (Map)
高階函數(shù) (Fun)
輸出至終端
更多關(guān)于列表的內(nèi)容
內(nèi)置函數(shù) (BIF)
模塊與函數(shù)
將大程序分在多個文件中
匹配、Guards 與變量的作用域
超時
列表
完整示例
頭文件
標(biāo)準(zhǔn)模塊與使用手冊
進程
記錄
增加健壯性后的完整示例
Erlang Shell
原子類型

內(nèi)置函數(shù) (BIF)

內(nèi)置函數(shù)是指那些出于某種需求而內(nèi)置到 Erlang 虛擬機中的函數(shù)。內(nèi)置函數(shù)常常實現(xiàn)那些在 Erlang 中不容易實現(xiàn)或者在 Erlang 中實現(xiàn)效率不高的函數(shù)。某些內(nèi)置函數(shù)也可以只用函數(shù)名就調(diào)用,因為這些函數(shù)是由于默認(rèn)屬于 erlang 模塊。例如,下面調(diào)用內(nèi)置函數(shù) trunc 等價于調(diào)用 erlang:trunc。

如下所示,判斷一個是否為閏年。如果可以被 400 整除,則為閏年。為了判斷,先將年份除以 400,再用 trunc 函數(shù)移去小數(shù)部分。然后,再將結(jié)果乘以 400 判斷是否得到最初的值。例如,以 2004 年為例:

2004 / 400 = 5.01
trunc(5.01) = 5
5 * 400 = 2000

2000 年與 2004 年不同,2004 不能被 400 整除。而對于 2000 來說,

2000 / 400 = 5.0
trunc(5.0) = 5
5 * 400 = 2000

所以,2000 年為閏年。接下來兩個 trunc 測試?yán)优袛嗄攴菔欠窨梢员?100 或者 4 整除。 首先第一個 if 語句返回 leap 或者 not_leap,該值存儲在變量 Leap 中的。這個變量會被用到后面 feb 的條件測試中,用于計算二月份有多少天。

這個例子演示了 trunc 的使用方法。其實,在 Erlang 中可以使用內(nèi)置函數(shù) rem 來求得余數(shù),這樣會簡單很多。示例如下:

74> 2004 rem 400.
4

所以下面的這段代碼也可以改寫:

trunc(Year / 400) * 400 == Year ->
    leap;

可以被改寫成:

Year rem 400 == 0 ->
    leap;

Erlang 中除了 trunc 之外,還有很多的內(nèi)置函數(shù)。其中只有一部分可以用在 guard 中,并且你不可以在 guard 中使用自定義的函數(shù) ( 參考 guard 序列 )。(高級話題:這不能保證 guard 沒有副作用)。讓我們在 shell 中測試一些內(nèi)置函數(shù):

75> trunc(5.6).
5
76> round(5.6).
6
77> length([a,b,c,d]).
4
78> float(5).
5.0
79> is_atom(hello).
true
80> is_atom("hello").
false
81> is_tuple({paris, {c, 30}}).
true
82> is_tuple([paris, {c, 30}]).
false

所有的這些函數(shù)都可以用到 guard 條件測試中。下現(xiàn)這些函數(shù)不可以用在 guard 條件測試中:

83> atom_to_list(hello).
"hello"
84> list_to_atom("goodbye").
goodbye
85> integer_to_list(22).
"22"

這三個內(nèi)置函數(shù)可以完成類型的轉(zhuǎn)換。要想在 Erlang 系統(tǒng)中(非 Erlang 虛擬機中)實現(xiàn)這樣的轉(zhuǎn)換幾乎是不可能的。

上一篇:超時下一篇:模塊與函數(shù)