Встроенные примитивы
Вы могли видеть, что некоторые функции из стандартной библиотеки определены как-то странно, как external функция, имя которой начинается с %
знака:
external succ : int -> int = "%succint"
Это, так называемые, примитивы или встроенные примитивы, реализация которых определена внутри компилятора. Так, например, определены функции по работе с числами, что делает возможным генерировать более эффективный машинный код.
Если брать ещё один пример, то выражения 1 + 2
и 1 |> (+) 1
в действительности преобразуются в одинаковый код, благодаря тому, что |>
реализован через компилятор, а не через "настоящую" функцию.
Все встроенные примитивы описываются в таблице primitives_table из файла lambda/translprim.ml
в формате ключ-значение, где ключ это строковая метка примитива, а значение — тот код (промежуточно представления), в который она должен быть преобразована. Пример всё того же succ
:
let primitives_table =
create_hashtable _ [
(* ... *)
"%succint", Primitive ((Poffsetint 1), 1);
(* ... *)
]