Revised syntax – альтернатива классическому original syntax в OCaml. Он проще, регулярнее, логичнее, и исправляет некоторые недостатки оригинального синтаксиса, иногда вызывающие трудноуловимые баги. Этот синтаксис был назван "righteous", но название не прижилось.

Как использовать

Интерактивно:

$ ocaml
        Objective Caml version 3.11.1

# #load "dynlink.cma";;
# #load "camlp4r.cma";;
        Camlp4 Parsing version 3.11.1

# value test = do { (); 1 };
value test : int = 1
#

При компиляции вызовом ocamlc, ocamlopt или ocamlfind – добавьте -pp camlp4r в строку компиляции:

$ ocamlfind ocamlopt -pp camlp4r mymodule.ml -o myexecutable

При компиляции через ocamlbuild добавьте в файл _tags тэг camlp4r для файлов, написанных в revised syntax, например,

<*.ml*> : camlp4r

Однако если добавлять тэг для всех *.ml*, а в проекте есть .ml-файлы, сгенерированные ocamllex/ocamlyacc (в original syntax), нужно будет исключить их:

<mylexer.ml> | <myparser.ml{,i}> : -camlp4r, camlp4o

Фразы

Императивные конструкции

Туплы и списки

Irrefutable patterns

Некоторые синтаксические конструкции используют понятие "irrefutable patterns". Сопоставление значений таким паттернам всегда успешно. Вот что может называться irrefutable pattern:

Заметьте, что термин "irrefutable" применяется не ко всем паттернам, сопоставление с которыми всегда удачно: например, тип с ровно одним конструктором (кроме () : unit) не является irrefutable.

Конструкции с паттерн матчингом

Изменяемые значения и присваивание

Типы

Модули

OcamlRevised
      type t = Set.Make(M).t;;
        type t = (Set.Make M).t;

Полиморфные варианты

Объявляются с указанием на открытость/закрытость типа:

type poly_open = [> `A | `B of (int * string) ];
type poly_eq = [= `A |`B of (int * string) ];
type poly_closed = [< `A | `B of (int * string) ];

Объекты

Объекты объявляются с использованием value для полей:

# object
    value my_field = 123;
    method my_method () = my_field;
  end;
- : < my_method : unit -> int > = <obj>

Разное

Streams and parsers


2011-03-26 13:08