Что не так с этим кодом OCaml?

Что не так с этим кодом?

let vm_run vm =
    let guard = ref true in
    while !guard do
        if vm.cur_pc = -1 && not (Stack.empty vm.call_stack) then vm_pop_ar vm
        else if vm.cur_pc = -1 then guard := false
        else if vm.cur_pc < Array.length vm.cur_code then
            execute vm Array.get vm.cur_code vm.cur_pc;
            vm.cur_pc <- vm.cur_pc + 1
        else vm_pop_ar vm
    done

Ошибка Error: Syntax error связана с последним else ключевым словом.

Я был уверен в OCaml, но цепочка if / else все еще доставляет мне некоторые проблемы ... это не первый раз (в прошлый раз я использовал поток, чтобы избежать использования ключевого слова else).

Я думаю, что это что-то маленькое, но у меня нет подсказок, согласно спецификации синтаксиса, все должно быть в порядке


person Jack    schedule 06.07.2010    source источник


Ответы (1)


Точка с запятой имеет более низкий приоритет, чем if-else, поэтому, когда вам нужно иметь блок из двух или более операторов, разделенных точкой с запятой внутри if, вам нужно заключить их в круглые скобки или блок begin...end (два эквивалентны):

    else if vm.cur_pc < Array.length vm.cur_code then begin
        execute vm Array.get vm.cur_code vm.cur_pc;
        vm.cur_pc <- vm.cur_pc + 1
    end
    else vm_pop_ar vm
person newacct    schedule 06.07.2010
comment
Спасибо, это было непросто :) Итак, он попытался разобрать завершение тела if до предполагаемого конца, обнаружив else непарным .. глупая вещь. Теперь понятно! - person Jack; 06.07.2010