Глава 7. Расширения языка
В этой главе описываются синтаксические расширения и усовершенствования, введенные в Objective Caml, но не описанные в справочном руководстве.
7.1 Потоки и анализаторы потоков
Потоки и анализаторы потоков больше не входят в язык Objective Caml, но
доступны в синтаксическом расширениия CamlP4. Дополнительная информация
приведена в справочном руководстве CamlP4. Программы, использующие потоки и
анализаторы потоков должны компилироватся ocamlc
и
ocamlopt
c ключами -pp camlp4o
. В интерактивном режиме
после запуска Бocaml
необходимо ввести команду #load
"camlp4o.cma";;
.
7.2 Диапазоны в образцах
В образцах Objective Caml распознает форму 'c1' .. 'd' (два символьных литерала, разделенных ..) как сокращение для
::= | 'c' | 'c1' | 'c2' | ... | 'cn' | 'd' |
где c1, c2, ..., cn являются символами, находящимися в наборе
символов ASCII между c и d. Например, образец '0' .. '9'
соотвествует любым цифровым символам.
7.3 Проверка утверждений
Для проверки утверждений во время отладки Objective Caml поддерживает
конструкцию assert
. Выражение assert expr вычисляет expr и возвращает (),
если в результате получено true
. В противном случае возбуждается
исключение Assert_failure
с именем файла, в котором содержится
исходный текст программы и номером строки, где находится expr, в качестве аргуметов. Проверка утверждений отключается с
помощью директивы компилятора -noassert
.
Выражение assert false
представляет особый случай - это
полиморфное сокращение для raise(Assert_failure ...)
(оно также
отключается с помощью директивы компилятора -noassert
).
7.4 Отложенные вычисления
Выражение lazy expr
возвращает значение v
типа Lazy.t
, которое
инкапсулирует вычисление expr. Аргумент expr не вычисляется до первого вызова Lazy.force
с аргументом v
, и только в этом случае возвращается результат expr. Последующие вызовы Lazy.force
с аргументом
v
не приводят к повторному выполнению expr.
Дополнительная информация содержится в документации модуля Lazy
стандартной библиотеки.
7.5 Локальные модули
Выражение let module module-name = module-expr in expr локально связывает выражение module-expr с именем module-name на время вычисления выражения expr. Затем оно возвращает результат expr. Пример:
let remove_duplicates comparison_fun string_list = let module StringSet = Set.Make(struct type t = string let compare = comparison_fun end) in StringSet.elements (List.fold_right StringSet.add string_list StringSet.empty)
7.6 Группировка в численных литералах
В целочисленных литералах и литералах для чисел с плавающей точкой знак _ (подчеркивание) может использоваться как разделитель числовыз групп, например, 1_000_000, 0x45_FF или 1_234.567_89. При чтении таких литералов знак подчекивания просто игнорируется.