2021-02-12 19:20:14 +03:00
|
|
|
(* This file is part of the Catala compiler, a specification language for tax
|
|
|
|
and social benefits computation rules. Copyright (C) 2020 Inria, contributor:
|
|
|
|
Denis Merigoux <denis.merigoux@inria.fr>
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
use this file except in compliance with the License. You may obtain a copy of
|
|
|
|
the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
License for the specific language governing permissions and limitations under
|
|
|
|
the License. *)
|
|
|
|
|
2022-08-12 23:42:39 +03:00
|
|
|
open Shared_ast
|
2021-02-12 19:20:14 +03:00
|
|
|
|
|
|
|
(** Abstract syntax tree for the lambda calculus *)
|
|
|
|
|
|
|
|
(** {1 Abstract syntax tree} *)
|
|
|
|
|
2023-05-17 17:15:00 +03:00
|
|
|
type 'm naked_expr = (lcalc, 'm) naked_gexpr
|
|
|
|
and 'm expr = (lcalc, 'm) gexpr
|
2021-11-02 20:09:59 +03:00
|
|
|
|
2022-08-25 20:46:13 +03:00
|
|
|
type 'm program = 'm expr Shared_ast.program
|
2022-04-12 18:54:00 +03:00
|
|
|
|
2023-04-18 16:45:30 +03:00
|
|
|
(** {1 Option-related management}*)
|
|
|
|
|
|
|
|
(** {2 Term building and management for the [option] monad}*)
|
|
|
|
|
2023-04-21 15:51:15 +03:00
|
|
|
module OptionMonad : sig
|
2023-05-17 17:15:00 +03:00
|
|
|
val return : mark:'m mark -> ('a any, 'm) boxed_gexpr -> ('a, 'm) boxed_gexpr
|
|
|
|
val empty : mark:'m mark -> ('a any, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val bind_var :
|
|
|
|
mark:'m mark ->
|
2023-05-17 17:15:00 +03:00
|
|
|
('a any, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) gexpr Var.t ->
|
|
|
|
('a, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val bind :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
2023-05-17 17:15:00 +03:00
|
|
|
('a any, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val bind_cont :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
2023-05-17 17:15:00 +03:00
|
|
|
(('a any, 'm) gexpr Var.t -> ('a, 'm) boxed_gexpr) ->
|
|
|
|
('a, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val mbind_mvar :
|
|
|
|
mark:'m mark ->
|
2023-05-17 17:15:00 +03:00
|
|
|
('a any, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) gexpr Var.t list ->
|
|
|
|
('a, 'm) boxed_gexpr list ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val mbind :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
2023-05-17 17:15:00 +03:00
|
|
|
('a any, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr list ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val mbind_cont :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
2023-05-17 17:15:00 +03:00
|
|
|
(('a any, 'm) gexpr Var.t list -> ('a, 'm) boxed_gexpr) ->
|
|
|
|
('a, 'm) boxed_gexpr list ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val error_on_empty :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
|
|
|
?toplevel:bool ->
|
2023-05-17 17:15:00 +03:00
|
|
|
((< exceptions : yes ; .. > as 'a), 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val map :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
2023-05-17 17:15:00 +03:00
|
|
|
((< exceptions : no ; .. > as 'a), 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val mmap_mvar :
|
|
|
|
mark:'m mark ->
|
2023-05-17 17:15:00 +03:00
|
|
|
('a any, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) gexpr Var.t list ->
|
|
|
|
('a, 'm) boxed_gexpr list ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
|
|
|
|
val mmap :
|
|
|
|
mark:'m mark ->
|
|
|
|
var_name:string ->
|
2023-05-17 17:15:00 +03:00
|
|
|
('a any, 'm) boxed_gexpr ->
|
|
|
|
('a, 'm) boxed_gexpr list ->
|
|
|
|
('a, 'm) boxed_gexpr
|
2023-04-21 15:51:15 +03:00
|
|
|
end
|