При синтаксическом анализе кода анализатор продвигается, пока не достигнет l q
.На этом этапе может быть больше аргументов, которые следует применить к функции l.Таким образом, анализатор продолжает работать, и следующая вещь, которую он находит, это значение print_int.Еще один аргумент в пользу л.Что дает вам вашу ошибку.
Парсер не может знать, что вы закончили код для функции l.На верхнем уровне специальный токен ;;
используется, чтобы сообщить синтаксическому анализатору, что ввод завершен, и теперь он должен оценить код.После этого он снова начинает обрабатывать оставшиеся входные данные.
Теперь, почему скомпилированный код также не имеет ';;'токен?
Просто потому, что он не нужен.В скомпилированном коде строка print_int(l [1;2;3;4])
не является допустимым вводом.Это было бы утверждение, которое вы хотите выполнить, и функциональные языки не имеют такой вещи.Вместо этого print_int(l [1;2;3;4])
- это выражение, которое возвращает значение () в этом случае, и вы должны указать компилятору, что делать с этим значением.let () =
говорит компилятору сопоставить его с ().И let ...
также сообщает компилятору, что предыдущий let rec l ...
завершен.Поэтому никакого специального токена ;;
не требуется.
Или подумайте об этом так: на верхнем уровне есть неявный let _ =
, если ваш ввод не начинается с let.Таким образом, вы можете просто ввести какое-нибудь выражение и посмотреть, к чему оно относится, без необходимости каждый раз вводить let _ =
.';;'токен все еще означает «оценить сейчас», хотя и все еще необходим.