Improve ReasonLIGO output.

This commit is contained in:
Sander Spies 2020-06-05 13:56:14 +02:00
parent 49d2c870ae
commit db0fdf4abd
27 changed files with 297 additions and 357 deletions

View File

@ -174,13 +174,13 @@ and pp_clause {value; _} =
and pp_cond_expr {value; _} = and pp_cond_expr {value; _} =
let {test; ifso; kwd_else; ifnot; _} = value in let {test; ifso; kwd_else; ifnot; _} = value in
let if_then = let if_then =
string "if" ^^ string "(" ^^ pp_expr test ^^ string ")" ^^ string " {" ^^ hardline string "if" ^^ string "(" ^^ pp_expr test ^^ string ")" ^^ string " {" ^^ break 0
^^ group (nest 2 (break 2 ^^ pp_expr ifso)) ^^ hardline ^^ string "}" in ^^ group (nest 2 (break 2 ^^ pp_expr ifso)) ^^ hardline ^^ string "}" in
if kwd_else#is_ghost then if kwd_else#is_ghost then
if_then if_then
else else
if_then if_then
^^ string " else" ^^ string " {" ^^ hardline ^^ group (nest 2 (break 2 ^^ pp_expr ifnot)) ^^ hardline ^^ string "}" ^^ string " else" ^^ string " {" ^^ break 0 ^^ group (nest 2 (break 2 ^^ pp_expr ifnot)) ^^ hardline ^^ string "}"
and pp_annot_expr {value; _} = and pp_annot_expr {value; _} =
let expr, _, type_expr = value.inside in let expr, _, type_expr = value.inside in
@ -201,7 +201,7 @@ and pp_bool_expr = function
and pp_bin_op op {value; _} = and pp_bin_op op {value; _} =
let {arg1; arg2; _} = value let {arg1; arg2; _} = value
and length = String.length op + 1 in and length = String.length op + 1 in
pp_expr arg1 ^/^ string (op ^ " ") ^^ nest length (pp_expr arg2) pp_expr arg1 ^^ string " " ^^ string (op ^ " ") ^^ nest length (pp_expr arg2)
and pp_un_op op {value; _} = and pp_un_op op {value; _} =
string (op ^ " ") ^^ pp_expr value.arg string (op ^ " ") ^^ pp_expr value.arg
@ -372,8 +372,11 @@ and pp_fun {value; _} =
None -> empty None -> empty
| Some (_,e) -> | Some (_,e) ->
group (break 0 ^^ string ":" ^^ nest 2 (break 1 ^^ pp_type_expr e)) group (break 0 ^^ string ":" ^^ nest 2 (break 1 ^^ pp_type_expr e))
in prefix 2 0 (string "(" ^^ binders ^^ string ")" ^^ annot in
^^ string " => ") (pp_expr body) match body with
| ESeq _ -> string "(" ^^ binders ^^ string ")" ^^ annot ^^ string " => " ^^ pp_expr body
| _ -> (prefix 2 0 (string "(" ^^ binders ^^ string ")" ^^ annot
^^ string " => ") (pp_expr body))
and pp_seq {value; _} = and pp_seq {value; _} =
let {compound; elements; _} = value in let {compound; elements; _} = value in

View File

@ -1,6 +1,5 @@
let main = let main =
(p: key_hash): address => (p: key_hash): address => {
{
let c: contract(unit) = Tezos.implicit_account(p); let c: contract(unit) = Tezos.implicit_account(p);
Tezos.address(c) Tezos.address(c)
}; };

View File

@ -1,7 +1,6 @@
let check_ = let check_ =
(p: unit): int => (p: unit): int =>
if(Tezos.amount if(Tezos.amount == 100000000mutez) {
== 100000000mutez) {
42 42
} else { } else {
0 0

View File

@ -1,20 +1,17 @@
let id_string = let id_string =
(p: string): option(string) => (p: string): option(string) => {
{
let packed: bytes = Bytes.pack(p); let packed: bytes = Bytes.pack(p);
((Bytes.unpack(packed)) : option(string)) ((Bytes.unpack(packed)) : option(string))
}; };
let id_int = let id_int =
(p: int): option(int) => (p: int): option(int) => {
{
let packed: bytes = Bytes.pack(p); let packed: bytes = Bytes.pack(p);
((Bytes.unpack(packed)) : option(int)) ((Bytes.unpack(packed)) : option(int))
}; };
let id_address = let id_address =
(p: address): option(address) => (p: address): option(address) => {
{
let packed: bytes = Bytes.pack(p); let packed: bytes = Bytes.pack(p);
((Bytes.unpack(packed)) : option(address)) ((Bytes.unpack(packed)) : option(address))
}; };

View File

@ -1,6 +1,5 @@
let check_signature = let check_signature =
(param: (key, signature, bytes)): bool => (param: (key, signature, bytes)): bool => {
{
let (pk, signed, msg) = param; let (pk, signed, msg) = param;
Crypto.check(pk, signed, msg) Crypto.check(pk, signed, msg)
}; };

View File

@ -1,6 +1,5 @@
let test = let test =
(k: int): int => (k: int): int => {
{
let j: int = k + 5; let j: int = k + 5;
let close: (int => int) = (i: int) => i + j; let close: (int => int) = (i: int) => i + j;
let j: int = 20; let j: int = 20;

View File

@ -1,9 +1,7 @@
let main = let main =
(i: int) => (i: int) => {
{
let result = 0; let result = 0;
if(i if(i == 2) {
== 2) {
let result = 42; let result = 42;
result result

View File

@ -1,7 +1,6 @@
let main = let main =
(i: int) => (i: int) =>
if(i if(i == 2) {
== 2) {
42 42
} else { } else {
0 0

View File

@ -1,7 +1,6 @@
let main = let main =
((a, b): (bool, bool)) => ((a, b): (bool, bool)) =>
if(a if(a == b) {
== b) {
999 999
} else { } else {
1 1

View File

@ -1,6 +1,5 @@
let foobar = let foobar =
(i: int): int => (i: int): int => {
{
let foo: int => int = (i: int) => i; let foo: int => int = (i: int) => i;
let bar: ((int => int) => int) = let bar: ((int => int) => int) =
(f: (int => int)) => f(i); (f: (int => int)) => f(i);
@ -8,15 +7,13 @@ let foobar =
}; };
let higher2 = let higher2 =
(i: int, f: (int => int)): int => (i: int, f: (int => int)): int => {
{
let ii: int = f(i); let ii: int = f(i);
ii ii
}; };
let foobar2 = let foobar2 =
(i: int): int => (i: int): int => {
{
let foo2: int => int = (i: int) => i; let foo2: int => int = (i: int) => i;
higher2(i, foo2) higher2(i, foo2)
}; };
@ -24,8 +21,7 @@ let foobar2 =
let a: int = 0; let a: int = 0;
let foobar3 = let foobar3 =
(i: int): int => (i: int): int => {
{
let foo2: int => int = (i: int) => a + i; let foo2: int => int = (i: int) => a + i;
higher2(i, foo2) higher2(i, foo2)
}; };
@ -37,15 +33,13 @@ let g = (i: int): int => f(i);
let foobar4 = (i: int): int => g(g(i)); let foobar4 = (i: int): int => g(g(i));
let higher3 = let higher3 =
(i: int, f: (int => int), g: (int => int)): int => (i: int, f: (int => int), g: (int => int)): int => {
{
let ii: int = f(g(i)); let ii: int = f(g(i));
ii ii
}; };
let foobar5 = let foobar5 =
(i: int): int => (i: int): int => {
{
let a: int = 0; let a: int = 0;
let foo: int => int = (i: int) => a + i; let foo: int => int = (i: int) => a + i;
let goo: int => int = (i: int) => foo(i); let goo: int => int = (i: int) => foo(i);

View File

@ -1,8 +1,6 @@
let check_hash_key = let check_hash_key =
(kh1_k2: (key_hash, key)): (bool, key_hash) => (kh1_k2: (key_hash, key)): (bool, key_hash) => {
{
let (kh1, k2) = kh1_k2; let (kh1, k2) = kh1_k2;
let kh2: key_hash = Crypto.hash_key(k2); let kh2: key_hash = Crypto.hash_key(k2);
((kh1 ((kh1 == kh2), kh2)
== kh2), kh2)
}; };

View File

@ -1,8 +1,7 @@
type storage = (int, int); type storage = (int, int);
let main = let main =
(n: (int, storage)): (list(operation), storage) => (n: (int, storage)): (list(operation), storage) => {
{
let x: (int, int) = let x: (int, int) =
{ {
let x: int = 7; let x: int = 7;
@ -18,8 +17,7 @@ let f1 = (a: string) => true;
let f2 = (a: string) => true; let f2 = (a: string) => true;
let letin_nesting = let letin_nesting =
(_: unit) => (_: unit) => {
{
let s = "test"; let s = "test";
let p0 = f0(s); let p0 = f0(s);
assert(p0); assert(p0);
@ -31,8 +29,7 @@ let letin_nesting =
}; };
let letin_nesting2 = let letin_nesting2 =
(x: int) => (x: int) => {
{
let y = 2; let y = 2;
let z = 3; let z = 3;
x + y + z x + y + z

View File

@ -11,8 +11,7 @@ let y: list(int) = [3, 4, 5];
let z: list(int) = [2, ...y]; let z: list(int) = [2, ...y];
let main = let main =
((action, s): (parameter, storage)): return => ((action, s): (parameter, storage)): return => {
{
let storage = let storage =
switch(action) { switch(action) {
| [] => s | [] => s
@ -24,8 +23,7 @@ let main =
let size_ = (s: list(int)): nat => List.length(s); let size_ = (s: list(int)): nat => List.length(s);
let fold_op = let fold_op =
(s: list(int)): int => (s: list(int)): int => {
{
let aggregate = (t: (int, int)) => t[0] + t[1]; let aggregate = (t: (int, int)) => t[0] + t[1];
List.fold(aggregate, s, 10) List.fold(aggregate, s, 10)
}; };
@ -35,8 +33,7 @@ let map_op =
List.map((cur: int) => cur + 1, s); List.map((cur: int) => cur + 1, s);
let iter_op = let iter_op =
(s: list(int)): unit => (s: list(int)): unit => {
{
let do_nothing = (useless: int) => unit; let do_nothing = (useless: int) => unit;
List.iter(do_nothing, s) List.iter(do_nothing, s)
}; };

View File

@ -1,7 +1,6 @@
let rec aux_simple = let rec aux_simple =
(i: int): int => (i: int): int =>
if(i if(i < 100) {
< 100) {
aux_simple(i + 1) aux_simple(i + 1)
} else { } else {
i i
@ -12,13 +11,11 @@ let counter_simple = (n: int): int => aux_simple(n);
type sum_aggregator = {counter: int, sum: int }; type sum_aggregator = {counter: int, sum: int };
let counter = let counter =
(n: int): int => (n: int): int => {
{
let initial: sum_aggregator = {counter: 0, sum: 0 }; let initial: sum_aggregator = {counter: 0, sum: 0 };
let rec aggregate = let rec aggregate =
(prev: sum_aggregator): int => (prev: sum_aggregator): int =>
if(prev.counter if(prev.counter <= n) {
<= n) {
aggregate({ aggregate({
@ -33,8 +30,7 @@ let counter =
let rec aux_nest = let rec aux_nest =
(prev: sum_aggregator): sum_aggregator => (prev: sum_aggregator): sum_aggregator =>
if(prev.counter if(prev.counter < 100) {
< 100) {
let sum: int = prev.sum + aux_simple(prev.counter); let sum: int = prev.sum + aux_simple(prev.counter);
aux_nest({counter: prev.counter + 1, sum: sum }) aux_nest({counter: prev.counter + 1, sum: sum })
@ -43,8 +39,7 @@ let rec aux_nest =
}; };
let counter_nest = let counter_nest =
(n: int): int => (n: int): int => {
{
let initial: sum_aggregator = {counter: 0, sum: 0 }; let initial: sum_aggregator = {counter: 0, sum: 0 };
let out: sum_aggregator = aux_nest(initial); let out: sum_aggregator = aux_nest(initial);
out.sum out.sum

View File

@ -40,30 +40,26 @@ let get_ = (m: foobar): option(int) => Map.find_opt(42, m);
let mem = (km: (int, foobar)): bool => Map.mem(km[0], km[1]); let mem = (km: (int, foobar)): bool => Map.mem(km[0], km[1]);
let iter_op = let iter_op =
(m: foobar): unit => (m: foobar): unit => {
{
let assert_eq = (i: int, j: int) => assert(i == j); let assert_eq = (i: int, j: int) => assert(i == j);
Map.iter(assert_eq, m) Map.iter(assert_eq, m)
}; };
let map_op = let map_op =
(m: foobar): foobar => (m: foobar): foobar => {
{
let increment = (z: int, j: int) => j + 1; let increment = (z: int, j: int) => j + 1;
Map.map(increment, m) Map.map(increment, m)
}; };
let fold_op = let fold_op =
(m: foobar): foobar => (m: foobar): foobar => {
{
let aggregate = let aggregate =
(i: int, j: (int, int)) => i + j[0] + j[1]; (i: int, j: (int, int)) => i + j[0] + j[1];
Map.fold(aggregate, m, 10) Map.fold(aggregate, m, 10)
}; };
let deep_op = let deep_op =
(m: foobar): foobar => (m: foobar): foobar => {
{
let coco = (0, m); let coco = (0, m);
let coco = (0, Map.remove(42, coco[1])); let coco = (0, Map.remove(42, coco[1]));
let coco = (0, Map.update(32, Some (16), coco[1])); let coco = (0, Map.update(32, Some (16), coco[1]));

View File

@ -5,11 +5,9 @@ type parameter = Add(int) | Sub(int);
type return = (list(operation), storage); type return = (list(operation), storage);
let main = let main =
((action, store): (parameter, storage)) => ((action, store): (parameter, storage)) => {
{
let store = let store =
store store + (switch(action) {
+ (switch(action) {
| Add(n) => n | Add(n) => n
| Sub(n) => -n | Sub(n) => -n
}); });

View File

@ -7,8 +7,7 @@ let add = ((a: int), (b: int)) => a + b;
let sub = ((a: int), (b: int)) => a - b; let sub = ((a: int), (b: int)) => a - b;
let main = let main =
((action, store): (parameter, storage)) => ((action, store): (parameter, storage)) => {
{
let store = let store =
switch(action) { switch(action) {
| Increment(n) => add(store, n) | Increment(n) => add(store, n)

View File

@ -6,8 +6,7 @@ type storage = michelson_pair
type return = (list(operation), storage); type return = (list(operation), storage);
let main = let main =
((action, store): (unit, storage)): return => ((action, store): (unit, storage)): return => {
{
let foo = (3, (1, 2n)); let foo = (3, (1, 2n));
(([] : list(operation)), (foo : storage)) (([] : list(operation)), (foo : storage))
}; };

View File

@ -30,33 +30,28 @@ type return = (list(operation), storage);
type parameter = CheckMessage(check_message_pt); type parameter = CheckMessage(check_message_pt);
let check_message = let check_message =
((param, s): (check_message_pt, storage)): return => ((param, s): (check_message_pt, storage)): return => {
{
let message: message = param.message; let message: message = param.message;
let s = let s =
if(param.counter if(param.counter != s.counter) {
!= s.counter) {
(failwith("Counters does not match") : storage) (failwith("Counters does not match") : storage)
} else { } else {
let packed_payload: bytes = let packed_payload: bytes =
Bytes.pack((message, param.counter, s.id, Bytes.pack((message, param.counter, s.id, chain_id));
chain_id));
let valid: nat = 0n; let valid: nat = 0n;
let keys: authorized_keys = s.auth; let keys: authorized_keys = s.auth;
let aux = let aux =
((vk, pkh_sig): ((vk, pkh_sig):
((nat, authorized_keys), (key_hash, signature))) ((nat, authorized_keys), (key_hash, signature)))
: :
(nat, authorized_keys) => (nat, authorized_keys) => {
{
let (valid, keys) = vk; let (valid, keys) = vk;
switch(keys) { switch(keys) {
| [] => vk | [] => vk
| [key, ...keys] => | [key, ...keys] =>
if(pkh_sig[0] if(pkh_sig[0] == Crypto.hash_key(key)) {
== Crypto.hash_key(key)) {
let valid = let valid =
if( if(
@ -65,9 +60,7 @@ let check_message =
packed_payload)) { packed_payload)) {
valid + 1n valid + 1n
} else { } else {
(failwith("Invalid signature") : nat)
(failwith("Invalid signature")
: nat)
}; };
(valid, keys) (valid, keys)
} else { } else {
@ -77,8 +70,7 @@ let check_message =
}; };
let (valid, keys) = let (valid, keys) =
List.fold(aux, param.signatures, (valid, keys)); List.fold(aux, param.signatures, (valid, keys));
if(valid if(valid < s.threshold) {
< s.threshold) {
( (
failwith("Not enough signatures passed the check") failwith("Not enough signatures passed the check")

View File

@ -1,10 +1,8 @@
type f = int; type f = int;
let a = let a =
(b: f) => (b: f) => {
{ if(b == 2) {
if(b
== 2) {
3 3
} else { } else {
4 4
@ -12,7 +10,6 @@ let a =
}; };
let c = let c =
(c: f) => (c: f) => {
{
3 3
}; };

View File

@ -5,18 +5,15 @@ type parameter =
| Distribute((unit => list(operation))); | Distribute((unit => list(operation)));
let donate = let donate =
((p, s): (unit, storage)): (list(operation), storage) => ((p, s): (unit, storage)): (list(operation), storage) => {
{
(([] : list(operation)), s) (([] : list(operation)), s)
}; };
let distribute = let distribute =
((p, s): ((unit => list(operation)), storage)) ((p, s): ((unit => list(operation)), storage))
: :
(list(operation), storage) => (list(operation), storage) => {
{ if(Tezos.sender == s) {
if(Tezos.sender
== s) {
(p(()), s) (p(()), s)
} else { } else {
@ -27,8 +24,7 @@ let distribute =
}; };
let main = let main =
((p, s): (parameter, storage)): (list(operation), storage) => ((p, s): (parameter, storage)): (list(operation), storage) => {
{
switch(p) { switch(p) {
| Donate => donate(((), s)) | Donate => donate(((), s))
| Distribute msg => distribute((msg, s)) | Distribute msg => distribute((msg, s))

View File

@ -1,7 +1,6 @@
let rec sum = let rec sum =
((n, acc): (int, int)): int => ((n, acc): (int, int)): int =>
if(n if(n < 1) {
< 1) {
acc acc
} else { } else {
sum((n - 1, acc + n)) sum((n - 1, acc + n))
@ -9,8 +8,7 @@ let rec sum =
let rec fibo = let rec fibo =
((n, n_1, n_0): (int, int, int)): int => ((n, n_1, n_0): (int, int, int)): int =>
if(n if(n < 2) {
< 2) {
n_1 n_1
} else { } else {
fibo((n - 1, n_1 + n_0, n_1)) fibo((n - 1, n_1 + n_0, n_1))

View File

@ -1,6 +1,5 @@
let main = let main =
(p: key_hash): list(operation) => (p: key_hash): list(operation) => {
{
let unused: operation = (Tezos.set_delegate(Some (p))); let unused: operation = (Tezos.set_delegate(Some (p)));
([] : list(operation)) ([] : list(operation))
}; };

View File

@ -5,8 +5,7 @@ type storage = int;
type return = (list(operation), storage); type return = (list(operation), storage);
let main = let main =
((action, store): (parameter, storage)): return => ((action, store): (parameter, storage)): return => {
{
let store = let store =
switch(action) { switch(action) {
| Increment(n) => store + n | Increment(n) => store + n

View File

@ -1,8 +1,7 @@
type fun_type = (int, int) => int; type fun_type = (int, int) => int;
let arguments = let arguments =
(b: int, c: int) => (b: int, c: int) => {
{
b + c b + c
}; };
@ -14,8 +13,7 @@ let arguments_test =
type tuple_type = ((int, int)) => int; type tuple_type = ((int, int)) => int;
let tuple = let tuple =
((a, b): (int, int)) => ((a, b): (int, int)) => {
{
a + b a + b
}; };
@ -24,8 +22,7 @@ let tuple_type_def = (b: tuple_type) => b((5, 3));
let tuple_test = (_: int) => tuple_type_def(tuple); let tuple_test = (_: int) => tuple_type_def(tuple);
let arguments_inline = let arguments_inline =
(b: int, c: int) => (b: int, c: int) => {
{
b + c b + c
}; };
@ -36,8 +33,7 @@ let arguments_test_inline =
(_: int) => arguments_type_def_inline(arguments_inline); (_: int) => arguments_type_def_inline(arguments_inline);
let tuple_inline = let tuple_inline =
((a, b): (int, int)) => ((a, b): (int, int)) => {
{
a + b a + b
}; };

View File

@ -3,7 +3,6 @@ type storage = (int, string, nat, bool);
type parameter = int; type parameter = int;
let main = let main =
((p, storage): (parameter, storage)) => ((p, storage): (parameter, storage)) => {
{
([] : list(operation), (2, "2", 2n, false)) ([] : list(operation), (2, "2", 2n, false))
}; };

View File

@ -7,8 +7,7 @@ let add = ((a, b): (int, int)): int => a + b;
let sub = ((a, b): (int, int)): int => a - b; let sub = ((a, b): (int, int)): int => a - b;
let main = let main =
((p, storage): (parameter, storage)) => ((p, storage): (parameter, storage)) => {
{
let storage = let storage =
switch(p) { switch(p) {
| Increment(n) => add((storage, n)) | Increment(n) => add((storage, n))