2014-12-25 2 views
1

Я пытаюсь скомпилировать следующий код: 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.

+1

Другим решением является использование функции в 'timer' модуля, либо' таймер: дц/1/2/3' сделать все или его 'Таймер: now_diff/2', если вы просто хотите, разница во времени , – rvirding

ответ

1

Вот Эрл 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}. 
Смежные вопросы