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