为什么不init:stop()直接终止?

时间:2009-11-25 18:01:07

标签: datetime erlang

我的代码显示今年的所有日子。

我不明白为什么if NewSec =< EndSec -> init:stop() end没有在run_calendar中第一次执行?

我希望init:stop()可以第一次执行,但事实并非如此。
有什么问题?

代码:

-module(cal).
-export([main/0]).

main() ->
    StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}),
    EndSec = calendar:datetime_to_gregorian_seconds({{2009,12,31},{0,0,0}}),
    run_calendar(StartSec,EndSec).

run_calendar(CurSec, EndSec) -> 
    {Date,_Time} = calendar:gregorian_seconds_to_datetime(CurSec),
    io:format("~p~n", [Date]),
    NewSec = CurSec + 60*60*24,
    if NewSec =< EndSec -> init:stop() end,
    run_calendar(NewSec, EndSec).

结果:

wk# erlc cal.erl 
wk# erl -noshell -s cal main
{2009,1,1}
{2009,1,2}
{2009,1,3}
{2009,1,4}
{2009,1,5}
...
{2009,12,22}
{2009,12,23}
{2009,12,24}
{2009,12,25}
{2009,12,26}
{2009,12,27}
{2009,12,28}
{2009,12,29}
{2009,12,30}
{2009,12,31}
wk# 

3 个答案:

答案 0 :(得分:4)

我相信init:stop()是一个异步进程,它会尝试平稳地关闭运行时。根据{{​​3}},“所有应用程序都已顺利删除,所有代码都已卸载,所有端口在系统终止之前都已关闭。”

实际停止可能需要一段时间,因为您有一个积极运行的过程。如果将“init:stop()”更改为“exit(stop)”,它将立即终止:

3> cal:main().
{2009,1,1}
** exception exit: stop
     in function  cal:run_calendar/2

答案 1 :(得分:2)

Init:stop是异步的,退出需要一些时间。另一种方法是在调用本身中包装测试并使用模式匹配来终止循环:

-module(cal).
-export([main/0]).

main() ->
    StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}),
    EndSec = calendar:datetime_to_gregorian_seconds({{2009,12,31},{0,0,0}}),
    run_calendar(false, StartSec, EndSec).

run_calendar(true, _StartSec, _EndSec) ->
    finished;

run_calendar(false, CurSec, EndSec) -> 
    {Date,_Time} = calendar:gregorian_seconds_to_datetime(CurSec),
    io:format("~p~n", [Date]),
    NewSec = CurSec + 60*60*24,
    run_calendar(NewSec =< EndSec, NewSec, EndSec).

(或者类似的东西,希望你能得到这个想法)

答案 2 :(得分:0)

你的if语句中有错误

你说

 if NewSec =< EndSec -> init:stop() end,

这是不正确的。你必须写下这样的东西:

if
    A =< B -> do something ...;
    true  -> do something else
end

if语法是

if
   Condition1 -> Actions1;
   Condition2 -> Actions2;
   ...
end

其中一个条件必须始终为真。

为什么会这样?

Erlang是一种函数式语言,而不是语句。在功能上 语言每个表达式都必须有一个值。 if是表达式,所以它必须有一个值。

(如果2> 1 - > 3结束)的值是3,但是值是多少 (如果1> 2 - > 3结束) - 回答它没有价值 - 但它必须有一个值 一切都必须有价值。

在一种陈述语言中,一切都会被评估其副作用 - 这样就可以了 是一个有效的建筑。

在Erlang中,您将生成异常。

所以你的代码会产生一个异常 - 你没有陷阱,所以你没有看到它 init:stop()永远不会被调用...