Skip to content

Встроенные примитивы

Вы могли видеть, что некоторые функции из стандартной библиотеки определены как-то странно, как external функция, имя которой начинается с % знака:

ocaml
external succ : int -> int = "%succint"

Это, так называемые, примитивы или встроенные примитивы, реализация которых определена внутри компилятора. Так, например, определены функции по работе с числами, что делает возможным генерировать более эффективный машинный код.

Если брать ещё один пример, то выражения 1 + 2 и 1 |> (+) 1 в действительности преобразуются в одинаковый код, благодаря тому, что |> реализован через компилятор, а не через "настоящую" функцию.

Все встроенные примитивы описываются в таблице primitives_table из файла lambda/translprim.ml в формате ключ-значение, где ключ это строковая метка примитива, а значение — тот код (промежуточно представления), в который она должен быть преобразована. Пример всё того же succ:

ocaml
let primitives_table = 
  create_hashtable _ [
    (* ... *)
    "%succint", Primitive ((Poffsetint 1), 1);
    (* ... *)
  ]