簡體   English   中英

Erlang函數for()?

[英]Erlang function for()?

據我了解,Erlang沒有執行for循環的功能。 但是,在此代碼段中,它使用了函數for()。 我不太了解for()函數,因此不勝感激。

-module(helloworld). 
-export([max/1,start/0]). 

max(N) -> 
   Max = erlang:system_info(process_limit), 
   io:format("Maximum allowed processes:~p~n" ,[Max]), 

   statistics(runtime), 
   statistics(wall_clock), 

   L = for(1, N, fun() -> spawn(fun() -> wait() end) end), 
   {_, Time1} = statistics(runtime),
   {_, Time2} = statistics(wall_clock),
   lists:foreach(fun(Pid) -> Pid ! die end, L),

   U1 = Time1 * 1000 / N, 
   U2 = Time2 * 1000 / N, 
   io:format("Process spawn time=~p (~p) microseconds~n" , [U1, U2]).

wait() ->
   receive 
      die -> void 
   end. 

for(N, N, F) -> [F()]; 
for(I, N, F) -> [F()|for(I+1, N, F)]. 

start()->
   max(1000), 
   max(100000).

另外,Erlang的運行時間和wall_clock有什么區別? 我相信掛鍾是基於計算機時鍾的,而運行時是基於Erlang中的某種滴答聲的? 我可能是錯的

我不太了解for()函數,因此不勝感激。

重命名函數xyz()。 現在,這有意義嗎?

xyz(N, N, F) -> [F()]; 
xyz(I, N, F) -> [F()|xyz(I+1, N, F)].

xyz()函數的第一個子句將查找相同(N, N...)的第一個和第二個參數。 如果前兩個參數相同,則xyz()返回一個列表,其中包含調用第3個參數的返回值。

當前兩個參數不同(I, N, ...)時,xyz()函數的第二個子句將匹配。 在這種情況下,將調用第三個參數,並且其返回值是列表的開頭,列表的xyz()是對xyz()函數的遞歸調用,其中第一個參數遞增。

因此,讓我們嘗試一個簡單的示例:

-module(f1).
-compile(export_all).

show() ->
   hello.


xyz(End, End, F) -> [F()]; 
xyz(Start, End, F) -> [F()|xyz(Start+1, End, F)].

test() ->
    xyz(0, 5, fun show/0).

在外殼中:

5> c(f1).    
f1.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,f1}

6> f1:test().
[hello,hello,hello,hello,hello,hello]

這是另一個示例:

for(End, End) ->
    io:format("~w~n", [End]); 
for(Start, End) -> 
    io:format("~w~n", [Start]),
    for(Start+1, End).


test() ->
    for(0, 5).

在外殼中:

12> c(f1).    
f1.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,f1}

13> f1:test().
0
1
2
3
4
5
ok
14> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM