ocamlbuild с Toploop / TopLevel - PullRequest
       90

ocamlbuild с Toploop / TopLevel

0 голосов
/ 15 апреля 2019

Я хочу реализовать функцию 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.

Я проверил каталог compiler-libs и у меня нет файла ocamltoplevel.cmxa, но у меня есть файл ocamltoplevel.cma.

Мне интересно, это простое исправление? Я немного новичок в ocaml, поэтому я не знаю, как это исправить. Спасибо!

1 Ответ

1 голос
/ 15 апреля 2019

Библиотека верхнего уровня доступна только в режиме байт-кода:

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

без необходимости в компиляторах.

...