我正在尝试编译以下erlang代码:
my_time_func(F) ->
{Mega, Mini, Micro} = now(),
F,
{SMega,SMini,SMicro} = now(),
{FMega,FMini,FMicro} = {SMega - Mega, SMini - Mini, SMicro - Micro},
if
FMicro < 0 -> %guard 1
if
FMini - 1 < 0 -> {FMega - 1, FMini, FMicro + (FMicro * 2) + 1};
true > 0 -> {FMega, FMini - 1, FMicro + (FMicro * 2) + 1};
end;
true -> %guard 2
if
FMini < 0 -> {FMega - 1, FMini + (FMini * 2) + 1, FMicro} ;
true > 0 -> {FMega,FMini,FMicro} ;
end;
end.
然而它说我在第19行结束之前有一个语法错误(这是第一个结束)。我错过了某种分号吗?
最初我打算在代码审查上发布这个,因为这段代码非常“难看”。有没有更好的方法来做这样的事情? (计时功能)不使用内置函数,最好是单独使用erlang模块。
答案 0 :(得分:1)
这是erlang if
表达式
if
GuardSeq1 ->
Body1;
...;
GuardSeqN ->
BodyN
end
因此,您需要在属于;
表达式的end
之前删除if
,修复版本如下;
my_time_func(F) ->
{Mega, Mini, Micro} = now(),
F,
{SMega,SMini,SMicro} = now(),
{FMega,FMini,FMicro} = {SMega - Mega, SMini - Mini, SMicro - Micro},
if
FMicro < 0 -> %guard 1
if
FMini - 1 < 0 -> {FMega - 1, FMini, FMicro + (FMicro * 2) + 1};
true > 0 -> {FMega, FMini - 1, FMicro + (FMicro * 2) + 1}
end;
true -> %guard 2
if
FMini < 0 -> {FMega - 1, FMini + (FMini * 2) + 1, FMicro} ;
true > 0 -> {FMega,FMini,FMicro}
end
end.
关于问题的第二部分,以微秒为单位取两个timestamp
的差异可能是另一种方式,例如;
now_diff({Meg2, Sec2, Mic2}, {Meg1, Sec1, Mic1}) ->
((Meg2 * 1000000 + Sec2) * 1000000 + Mic2) - ((Meg1 * 1000000 + Sec1) * 1000000 + Mic1).
my_time_func(F) ->
T1 = now(),
F(),
T2 = now(),
Diff = now_diff(T2, T1),
{Diff div 1000000000000, (Diff rem 1000000000000) div 1000000, Diff rem 1000000}.