我的代码显示今年的所有日子。
我不明白为什么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#
答案 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()永远不会被调用...