Глава
1
Глава
2
Глава
3
Глава
4
Глава
5
Глава
6  navigation 
Глава
8
Глава
9
Глава
10
Глава
11
Глава
12
Глава
13
Глава
14 

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