ocamlbuild с Toploop/TopLevel
Я ищу, чтобы реализовать функцию eval, как в этом ответе здесь: /questions/7857061/eval-stroka-v-ocaml/7857068#7857068
Однако, когда я иду, чтобы скомпилировать мой пример кода:
let eval code =
let as_buf = Lexing.from_string code in
let parsed = !Toploop.parse_toplevel_phrase as_buf in
ignore (Toploop.execute_phrase true Format.std_formatter parsed)
let rec sum_until n =
if n = 0
then 0
else n + sum_until (n - 1);;
let a = print_string "Enter sum_until x where x = an int: "; read_line ();;
print_int eval a;;
со следующим:
ocamlbuild UserInputEval.native -pkgs compiler-libs,compiler-libs.toplevel
Я получаю ошибку:
File "_none_", line 1: Error: Cannot find file
/usr/lib/ocaml/compiler-libs/ocamltoplevel.cmxa Command exited with
code 2.
Я проверил каталог compiler-libs и у меня нет файла ocamltoplevel.cmxa, но у меня есть файл ocamltoplevel.cma.
Мне интересно, это простое исправление? Я немного новичок в ocaml, поэтому я не знаю, как это исправить. Спасибо!
1 ответ
Библиотека верхнего уровня доступна только в режиме байт-кода:
ocamlbuild UserInputEval.byte -pkgs compiler-libs,compiler-libs.toplevel
Также обратите внимание, что пакет compiler-libs может потребоваться установить отдельно (по крайней мере, это относится к archlinux).
Тем не менее, ваш код, вероятно, не выполняет то, что вы ожидаете: вы только вводите пользовательский ввод в интерпретатор верхнего уровня, не читая ничего из состояния верхнего уровня.
Если вы просто хотите прочитать целое число, вы можете сделать это просто:
let a = print_string "Enter sum_until x where x = an int: \n"; read_int ();;
print_int (sum_until a);;
без необходимости в компиляторах.