Синтаксическая ошибка при использовании батарей в Utop - PullRequest
0 голосов
/ 08 января 2020

Я успешно установил батареи и могу заставить его работать ... несколько.

Batteries Syntax Error Любые идеи, почему я получаю синтаксическую ошибку, так как Опам перечислил это:

зависит: "ocaml" {> = "4.00.0" & <"4.10.0"} </p>

И я нахожусь на: верхний уровень OCaml, версия 4.07.1

1 Ответ

1 голос
/ 08 января 2020

Этот код опирается на препроцессор camlp4 , который устарел и больше не поддерживается. Кроме того, списки больше не являются частью библиотеки батарей и представляют собой отдельный пакет. Поэтому вам нужно установить его, используя opam install pa_comprehension. Вы по-прежнему можете заставить свой код работать для OCaml 4.07.1, выполнив следующие директивы сразу после того, как вы запустите OCaml toplevel (или utop)

#use "topfind";;
#camlp4o;;
#require "pa_comprehension";;

Первая директива (обратите внимание, вы должны набрать # it является частью директивы), включает ocamlfind на верхнем уровне (я думаю, что это не нужно в Utop, но не будет работать). Следующая директива включает синтаксис camlp4o, поэтому все входные данные предварительно обрабатываются. После этого вы больше не пишете в OCaml, а на диалекте camlp4o. Наконец, последняя директива загружает препроцессор, который поддерживает списки.

Чтобы скомпилировать код, использующий понимание списка, вам нужно указать те же опции для компилятора (т. Е. Включить синтаксис, загрузить препроцессор), например,

ocamlfind ocamlopt -syntax camlp4o -package pa_comprehension -linkpkg example.ml -o example

Пакет camlp4 также предоставляет другой синтаксис понимания списка, который немного отличается от того, который предоставляется батареями. Он называется camlp4.listcomprehension, и вы можете использовать его с примерно одинаковыми вызовами по модулю имени пакета, например, на верхнем уровне,

#use "topfind";;
#camlp4o;;
#require "camlp4.listcomprehension";;

и для компиляции

ocamlfind ocamlopt -syntax camlp4o -package camlp4.listcomprehension -linkpkg example.ml -o example

со всеми Тем не менее, я настоятельно не рекомендую вам использовать списки Camlp4 в наши дни. Это устаревшая технология.

Кроме того, ваш пример плохо сформирован, вам не хватает символа ? в закрывающей скобке, например, это пример взаимодействия с верхним уровнем,

   # #use "topfind";;
   # #camlp4o;;
   # #require "pa_comprehension";;
   # open Batteries;;
   # [? x | x <- 1--10; x mod 2 = 0 ?];;
   - : int Batteries.Enum.t = <abstr>
...