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

2022-07-07 15:40 更新

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

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

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

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

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

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

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

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

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 序列 )。(高級(jí)話題:這不能保證 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"

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)