Я хочу реализовать функцию eval, как в этом ответе здесь: https://stackoverflow.com/a/33293116/
Однако, когда я собираюсь скомпилировать свой пример кода:
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.
Я проверил каталог компиляторов и обнаружил, что у меня нет файла ocamltoplevel.cmxa, но есть файл ocamltoplevel.cma.
Мне интересно, это простое решение? Я немного новичок в ocaml, поэтому не знаю, как это исправить. Спасибо!
Библиотека верхнего уровня доступна только в режиме байт-кода:
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);;
без какой-либо необходимости в компиляторах.