2019-09-10 15:19:15 +02:00
|
|
|
open Trace
|
|
|
|
|
2020-03-04 15:38:10 +01:00
|
|
|
type form =
|
|
|
|
| Contract of string
|
|
|
|
| Env
|
|
|
|
|
2020-04-13 19:19:49 +02:00
|
|
|
let compile (cform: form) (program : Ast_core.program) : (Ast_typed.program * Ast_typed.typer_state) result =
|
2019-10-11 15:21:21 -04:00
|
|
|
let%bind (prog_typed , state) = Typer.type_program program in
|
|
|
|
let () = Typer.Solver.discard_state state in
|
2020-03-09 11:26:13 +01:00
|
|
|
let%bind applied = Self_ast_typed.all_program prog_typed in
|
|
|
|
let%bind applied' = match cform with
|
|
|
|
| Contract entrypoint -> Self_ast_typed.all_contract entrypoint applied
|
|
|
|
| Env -> ok applied in
|
|
|
|
ok @@ (applied', state)
|
2019-09-20 18:56:55 +02:00
|
|
|
|
2020-05-07 16:08:31 +02:00
|
|
|
let compile_expression ?(env = Ast_typed.Environment.empty) ~(state : Ast_typed.typer_state) (e : Ast_core.expression)
|
2020-04-13 19:19:49 +02:00
|
|
|
: (Ast_typed.expression * Ast_typed.typer_state) result =
|
2020-03-12 23:20:39 +01:00
|
|
|
let%bind (ae_typed,state) = Typer.type_expression_subst env state e in
|
2019-12-06 16:32:18 +01:00
|
|
|
let () = Typer.Solver.discard_state state in
|
2020-03-02 19:26:23 +01:00
|
|
|
let%bind ae_typed' = Self_ast_typed.all_expression ae_typed in
|
|
|
|
ok @@ (ae_typed',state)
|
2019-12-12 11:00:04 +01:00
|
|
|
|
2020-03-16 14:28:05 +01:00
|
|
|
let apply (entry_point : string) (param : Ast_core.expression) : Ast_core.expression result =
|
2019-12-11 19:15:25 +01:00
|
|
|
let name = Var.of_name entry_point in
|
2020-03-16 14:28:05 +01:00
|
|
|
let entry_point_var : Ast_core.expression =
|
|
|
|
{ expression_content = Ast_core.E_variable name ;
|
2019-12-11 19:15:25 +01:00
|
|
|
location = Virtual "generated entry-point variable" } in
|
2020-03-16 14:28:05 +01:00
|
|
|
let applied : Ast_core.expression =
|
2020-03-18 17:27:27 +01:00
|
|
|
{ expression_content = Ast_core.E_application {lamb=entry_point_var; args=param} ;
|
2019-12-11 19:15:25 +01:00
|
|
|
location = Virtual "generated application" } in
|
|
|
|
ok applied
|
2020-01-21 12:24:51 +00:00
|
|
|
|
2020-03-16 14:28:05 +01:00
|
|
|
let pretty_print formatter (program : Ast_core.program) =
|
|
|
|
Ast_core.PP.program formatter program
|
2019-12-20 15:52:49 +01:00
|
|
|
|
2020-03-16 14:28:05 +01:00
|
|
|
let list_declarations (program : Ast_core.program) : string list =
|
2019-12-20 15:52:49 +01:00
|
|
|
List.fold_left
|
|
|
|
(fun prev el ->
|
|
|
|
let open Location in
|
2020-03-16 14:28:05 +01:00
|
|
|
let open Ast_core in
|
2019-12-20 15:52:49 +01:00
|
|
|
match el.wrap_content with
|
|
|
|
| Declaration_constant (var,_,_,_) -> (Var.to_name var)::prev
|
|
|
|
| _ -> prev)
|
|
|
|
[] program
|