Что не так с этим кодом OCaml? - PullRequest
1 голос
/ 06 июля 2010

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

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).

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

1 Ответ

4 голосов
/ 06 июля 2010

Точка с запятой имеет более низкий приоритет, чем 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
...