Этот код опирается на препроцессор 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>