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

Datetime 为什么init:stop()不直接终止?,datetime,erlang,Datetime,Erlang,我的代码用于显示今年的所有日期 我不明白为什么如果NewSec=init:stop()end没有在运行日历中第一次执行 我希望init:stop()可以第一次执行,但事实并非如此 怎么了 代码: -module(cal). -export([main/0]). main() -> StartSec = calendar:datetime_to_gregorian_seconds({{2009,1,1},{0,0,0}}), EndSec = calendar:dateti

我的代码用于显示今年的所有日期

我不明白为什么
如果NewSec=init:stop()end
没有在运行日历中第一次执行

我希望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).
我相信init:stop()是一个异步进程,它将尝试平稳地关闭运行时。根据“在系统终止之前,所有应用程序都被顺利关闭,所有代码都被卸载,所有端口都被关闭。”

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

3> cal:main().
{2009,1,1}
** exception exit: stop
     in function  cal:run_calendar/2
我相信init:stop()是一个异步进程,它将尝试平稳地关闭运行时。根据“在系统终止之前,所有应用程序都被顺利关闭,所有代码都被卸载,所有端口都被关闭。”

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

3> cal:main().
{2009,1,1}
** exception exit: stop
     in function  cal:run_calendar/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).
-模块(校准)。
-导出([main/0])。
main()->
StartSec=日历:日期时间到公历秒({2009,1,1},{0,0,0}),
EndSec=日历:日期时间到公历秒({2009,12,31},{0,0,0}),
运行日历(false、StartSec、EndSec)。
运行日历(正确,开始,结束)->
完成;
运行日历(false、CurSec、EndSec)->
{Date,{u Time}=日历:公历秒到日期时间(CurSec),
io:格式(“~p~n,[Date]),
NewSec=CurSec+60*60*24,
运行日历(NewSec=

(或者类似的,希望你能理解)

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).
-模块(校准)。
-导出([main/0])。
main()->
StartSec=日历:日期时间到公历秒({2009,1,1},{0,0,0}),
EndSec=日历:日期时间到公历秒({2009,12,31},{0,0,0}),
运行日历(false、StartSec、EndSec)。
运行日历(正确,开始,结束)->
完成;
运行日历(false、CurSec、EndSec)->
{Date,{u Time}=日历:公历秒到日期时间(CurSec),
io:格式(“~p~n,[Date]),
NewSec=CurSec+60*60*24,
运行日历(NewSec=

(或者类似的,希望你能理解)

你的if语句有错误

你说

if NewSec =< EndSec -> init:stop() end, 如果NewSec=init:stop()结束, 这是不正确的。你必须写一些类似的东西:

if A =< B -> do something ...; true -> do something else end 如果 A=做点什么。。。; 对->做点别的 结束 if语法是

if Condition1 -> Actions1; Condition2 -> Actions2; ... end 如果 条件1->行动1; 条件2->行动2; ... 结束 其中一个条件必须始终为真

为什么会这样

Erlang是一种函数语言,而不是语句语言。以功能性的方式 语言每个表达式都必须有一个值。if是一个表达式,因此它必须有一个值

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

在语句语言中,每件事都会根据其副作用进行评估——因此 这是一个有效的结构

在Erlang中,您将生成一个异常

因此,您的代码会生成一个异常——您不会捕获该异常,因此您不会看到它,并且
init:stop()永远不会被调用…

您的if语句中有一个错误

你说

if NewSec =< EndSec -> init:stop() end, 如果NewSec=init:stop()结束, 这是不正确的。你必须写一些类似的东西:

if A =< B -> do something ...; true -> do something else end 如果 A=做点什么。。。; 对->做点别的 结束 if语法是

if Condition1 -> Actions1; Condition2 -> Actions2; ... end 如果 条件1->行动1; 条件2->行动2; ... 结束 其中一个条件必须始终为真

为什么会这样

Erlang是一种函数语言,而不是语句语言。以功能性的方式 语言每个表达式都必须有一个值。if是一个表达式,因此它必须有一个值

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

在语句语言中,每件事都会根据其副作用进行评估——因此 这是一个有效的结构

在Erlang中,您将生成一个异常

因此,您的代码会生成一个异常——您不会捕获该异常,因此您不会看到它,并且
init:stop()永远不会被调用…

即使你有一个“适合用途”的免责声明:“end”是一个关键字,如果你想将它作为一个原子,它必须是单引号。是的,我在我的示例中有null,我认为end在输出中会更好。Do'h我现在已经更改了它,尽管您有一个适合用途的免责声明:“end”是一个关键字,如果您想将其作为atom,则必须单引号引用。是的,我的示例中有null,并且认为end在输出中会更好。我现在已经更改了,为什么不将if改为不调用
run\u calendar/2
递归:
if NewSec=ok;true->run_calendar(NewSec,EndSec)end.
你的程序将正常退出,不会出现奇怪的行为。为什么不将if更改为不调用
run_calendar/2
递归:
if NewSec=ok;true->run_calendar(NewSec,EndSec)end.
程序将正常退出,不会出现异常行为。