2010-07-06 1 views
1

Что не так с этим кодом?Что случилось с этим кодом 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).

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

ответ

4

точка с запятой имеет более низкий приоритет, чем если-то еще, поэтому, когда вам нужно иметь блок из двух или более операторов, разделенных точкой с запятой внутри 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 
+0

Спасибо, что было трудным :) Так он пытался разобрать окончание, если тела до намеченного конца найти «чужое» неспаренное ... глупое дело. Теперь это понятно! – Jack

 Смежные вопросы

  • Нет связанных вопросов^_^