Глава 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. При чтении таких литералов знак подчекивания просто игнорируется.