第二節 模組與函式 上

2022-05-07 08:54:11 字數 2906 閱讀 3334

模組是erlang的基本**單元.模組儲存在擴充套件名為.erl的檔案裡,而且必須先編譯才能執行模組裡面的**.編譯後的模組以.beam作為副檔名.

我們建立乙個geometry.erl的檔案

1 -module

(geometry).

2 -export ([area/1]).

34 area() -> width *height;

5 area() -> side * side.

然後在shell中編譯這個模組,並且執行它.

1> c(geometry).

2> geometry:area().

503> geometry:area().

16第一行c(檔名)的作用是編譯檔案裡面的**,執行成功會返回這樣的結果.同時生成乙個.beam的目標**模組.

第二行我們通過檔名:方法(引數)的方式來呼叫模組中的函式.(請注意,需要給函式名附上模組名,這樣才能準確標明想呼叫的是哪個函式).

下一步,我們試著在模組中新增一些簡單的測試模組.把之前那個模組命名為geometry_test.erl

1 -module

(geometry_test).

2 -export ([test/0,area/1]).

34 test() ->

5 12 = area(),

6 144 = area(),

7tests_worked.

89 area() -> width *height;

10 area() -> side * side.

然後我們在shell中編譯模組並且執行如果得到test_worked這樣的字樣就表示測試通過.

1> c(geometry_test).

2> geometry_test:text().

** exception error: undefined function geometry_test:text/0

3> geometry_test:test().

tests_worked

如果在shell中輸入錯了函式名就會有錯誤提示.

我們給之前的函式擴充套件一下增加乙個area()  ->  3.14159 * radius * radius. 要新增的子句,順序無關緊要.無論子句如何排列,程式都是乙個意思,因為子句裡面的各個模式是互斥的.這就讓我們編寫擴充套件程式簡單了很多.

最後再看一下我們這個模組,我們會發現有逗號(,)分號(;)句號(.)這樣的符號.

逗號(,)分隔函式呼叫,資料構造和模式中的引數.

分號(;)分隔子句.

句號(.)分隔函式整體.

erlang是一種函式式的程式語言.此外,函式式程式語言還表示函式可以被用作其他函式的的引數,也可以返回函式.操作其他函式的函式被稱為高階函式,而在erlang中用於代表函式的資料型別被稱為fun.

1.對列表裡面的每乙個元素執行相同的操作.

2.建立自己的控制抽象.(erlang中沒有for迴圈)

3.實現可重入解析**,解析組合器,或惰性求值器等事物.

1> double = fun(x) -> 2*x end.

#fun

2> double(2).

4上面就是在shell中定義乙個fun的方法.

下面我們看看定義2個引數是什麼樣的.

3> hypot = fun(x, y)    ->      math:sqrt(x*x + y*y) end.

#fun

4> hypot(3,4).

5.0接下來我們以fun作為引數.標準庫中lists模組匯出了一些以fun作為引數的函式.他們之中最有用的就是lists:map(f,l).這個函式返回的是乙個列表,它通過給列表l裡的各個元素應用fun f生成.

5> l = [1,2,3,4].

[1,2,3,4]

6> lists:map(fun(x) -> 2*x end, l).

[2,4,6,8]

另外乙個有用的函式是lists:filter(p, l),它返回乙個新的列表,內含l中所有符合條件的元素(條件是對元素e而言p(e)為true).

even = fun(x) -> (x rem 2) =:= 0 end.

定義乙個函式even(x),如果x是偶數就返回true. rem會計算出除以2後的餘數,=:=用來測試是否相等.

然後我們用map和filter為引數.

10> lists:map(even, [1,2,3,4,5,6,8]).

[false,true,false,true,false,true,true]

11> lists:filter(even, [1,2,3,4,5,6,8]).

[2,4,6,8]

函式不僅可以使用fun作為引數,還能返回fun.

記住括號裡面的東西就是返回值.

下面我們來實現乙個自定義的控制抽象,不過到目前為止erlang中我們還沒有看見if語句,switch語句,for語句或者while語句,然後這一切都是用模式匹配和高階函式編寫的.我們自己實現乙個for結構模組.

1 -module

(lib_misc).

2 -export ([for/3]).

34 for(max, max, f) ->[f(max)];

5 for(i, max, f) -> [f(i) | for(i+1, max, f)].

然後在shell上執行這個模組

1> lib_misc:for(1,10,fun(i) -> i end).

[1,2,3,4,5,6,7,8,9,10]

2> lib_misc:for(1,10,fun(i) -> i*i end).

[1,4,9,16,25,36,49,64,81,100]

函式第二節

coding utf 8 1.定義乙個方法get num num num引數是列表型別,判斷列表裡面的元素為數字型別。其他型別則報錯,並且返回乙個偶數列表 注 列表裡面的元素為偶數 def get num l l for i in l 判斷列表l的元素是否都為整形 if not isinstance...

第二節 系統函式拓展

1,dup 影印檔案描述符 複製多乙個檔案描述符出來 include int dup int oldfd 由系統自動給你分配乙個 int dup2 int oldfd,int newfd 自己指定乙個檔案描述符newfd define gnu source see feature test macr...

Python函式 第二節 呼叫函式

所謂abs 即絕對值 print abs 2 print abs 1.111111111111 print abs 1 e anaconda3 anaconda python.exe f seven.py 21.111111111111 1process finished with exit cod...