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