1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[@@@ocaml.text "/*"]
(** Copyright 2021-2024, Kakadu and contributors *)
(** SPDX-License-Identifier: LGPL-3.0-or-later *)
[@@@ocaml.text "/*"]
type name = string [@@deriving show { with_path = false }]
(** Бинарные операторы для арифметики и сравнения *)
type binop =
| Add (** Сложение: '+' *)
| Sub (** Вычитание: '-' *)
| Mul (** Умножение: '*' *)
| Div (** Деление: '/' *)
| Eq (** Равенство: '=' *)
| Lt (** Меньше: '<' *)
| Gt (** Больше: '>' *)
| Le (** Меньше или равно: '<=' *)
| Ge (** Больше или равно: '>=' *)
[@@deriving show { with_path = false }]
type expr =
| Var of name (** Переменная, например: `x`, `y`, `foo` *)
| Abs of name * expr (** Лямбда-функция (абстракция), например: `fun x -> x + 1` *)
| App of expr * expr (** Применение функции, например: `f 5` *)
| Const of int (** Целочисленная константа, например: `0`, `15`, `-7` *)
| BinOp of binop * expr * expr (** Бинарная операция, например: `2 + 3`, `x * y` *)
| If of expr * expr * expr
| Let of name * expr * expr (** Let-связывание: `let x = значение in тело` *)
| LetRec of name * name * expr * expr
(** Рекурсивное let-связывание: `let rec f x = тело_f in выражение` *)
| Fix of expr (** Оператор фиксированной точки для рекурсии (fix combinator) *)
| Prim of string * expr list (** Примитивные функции: `println_int(42)` *)
[@@deriving show { with_path = false }]