more lists
This commit is contained in:
parent
ad79188c4f
commit
9fb65e71e8
@ -247,7 +247,9 @@ module Errors = struct
|
|||||||
let pattern_loc = Raw.pattern_to_region p in
|
let pattern_loc = Raw.pattern_to_region p in
|
||||||
let data = [
|
let data = [
|
||||||
("pattern_loc",
|
("pattern_loc",
|
||||||
fun () -> Format.asprintf "%a" Location.pp_lift @@ pattern_loc)
|
fun () -> Format.asprintf "%a" Location.pp_lift @@ pattern_loc) ;
|
||||||
|
("pattern",
|
||||||
|
fun () -> Format.asprintf "%a" (Simple_utils.PP_helpers.printer Parser.Pascaligo.ParserLog.print_pattern) p) ;
|
||||||
] in
|
] in
|
||||||
error ~data title message
|
error ~data title message
|
||||||
|
|
||||||
@ -914,7 +916,6 @@ and simpl_cases : type a . (Raw.pattern * a) list -> a matching result = fun t -
|
|||||||
| p -> fail @@ unsupported_non_var_pattern p in
|
| p -> fail @@ unsupported_non_var_pattern p in
|
||||||
let get_tuple (t: Raw.pattern) =
|
let get_tuple (t: Raw.pattern) =
|
||||||
match t with
|
match t with
|
||||||
| PCons v -> npseq_to_list v.value
|
|
||||||
| PTuple v -> npseq_to_list v.value.inside
|
| PTuple v -> npseq_to_list v.value.inside
|
||||||
| x -> [ x ] in
|
| x -> [ x ] in
|
||||||
let get_single (t: Raw.pattern) =
|
let get_single (t: Raw.pattern) =
|
||||||
@ -923,6 +924,15 @@ and simpl_cases : type a . (Raw.pattern * a) list -> a matching result = fun t -
|
|||||||
trace_strong (unsupported_tuple_pattern t) @@
|
trace_strong (unsupported_tuple_pattern t) @@
|
||||||
Assert.assert_list_size t' 1 in
|
Assert.assert_list_size t' 1 in
|
||||||
ok (List.hd t') in
|
ok (List.hd t') in
|
||||||
|
let get_toplevel (t : Raw.pattern) =
|
||||||
|
match t with
|
||||||
|
| PCons x -> (
|
||||||
|
let (x' , lst) = x.value in
|
||||||
|
match lst with
|
||||||
|
| [] -> ok x'
|
||||||
|
| _ -> ok t
|
||||||
|
)
|
||||||
|
| _ -> fail @@ corner_case ~loc:__LOC__ "unexpected pattern" in
|
||||||
let get_constr (t: Raw.pattern) =
|
let get_constr (t: Raw.pattern) =
|
||||||
match t with
|
match t with
|
||||||
| PConstr v -> (
|
| PConstr v -> (
|
||||||
@ -943,10 +953,8 @@ and simpl_cases : type a . (Raw.pattern * a) list -> a matching result = fun t -
|
|||||||
| _ -> fail @@ only_constructors t in
|
| _ -> fail @@ only_constructors t in
|
||||||
let%bind patterns =
|
let%bind patterns =
|
||||||
let aux (x , y) =
|
let aux (x , y) =
|
||||||
let xs = get_tuple x in
|
let%bind x' = get_toplevel x in
|
||||||
trace_strong (unsupported_tuple_pattern x) @@
|
ok (x' , y)
|
||||||
Assert.assert_list_size xs 1 >>? fun () ->
|
|
||||||
ok (List.hd xs , y)
|
|
||||||
in bind_map_list aux t in
|
in bind_map_list aux t in
|
||||||
match patterns with
|
match patterns with
|
||||||
| [(PFalse _ , f) ; (PTrue _ , t)]
|
| [(PFalse _ , f) ; (PTrue _ , t)]
|
||||||
|
@ -2,6 +2,10 @@ type storage = int * int list
|
|||||||
|
|
||||||
type param = int list
|
type param = int list
|
||||||
|
|
||||||
|
let x : int list = []
|
||||||
|
let y : int list = [ 3 ; 4 ; 5 ]
|
||||||
|
let z : int list = 2 :: y
|
||||||
|
|
||||||
let%entry main (p : param) storage =
|
let%entry main (p : param) storage =
|
||||||
let storage =
|
let storage =
|
||||||
match p with
|
match p with
|
||||||
|
@ -29,3 +29,10 @@ function match_expr_option (const o : option(int)) : int is
|
|||||||
| None -> 42
|
| None -> 42
|
||||||
| Some (s) -> s
|
| Some (s) -> s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function match_expr_list (const l : list(int)) : int is
|
||||||
|
begin skip end with
|
||||||
|
case l of
|
||||||
|
| nil -> -1
|
||||||
|
| hd # tl -> hd
|
||||||
|
end
|
||||||
|
@ -517,6 +517,13 @@ let matching () : unit result =
|
|||||||
bind_iter_list aux
|
bind_iter_list aux
|
||||||
[Some 0 ; Some 2 ; Some 42 ; Some 163 ; Some (-1) ; None]
|
[Some 0 ; Some 2 ; Some 42 ; Some 163 ; Some (-1) ; None]
|
||||||
in
|
in
|
||||||
|
let%bind () =
|
||||||
|
let aux lst = e_annotation (e_list @@ List.map e_int lst) (t_list t_int) in
|
||||||
|
let%bind () = expect_eq program "match_expr_list" (aux [ 14 ; 2 ; 3 ]) (e_int 14) in
|
||||||
|
let%bind () = expect_eq program "match_expr_list" (aux [ 13 ; 2 ; 3 ]) (e_int 13) in
|
||||||
|
let%bind () = expect_eq program "match_expr_list" (aux []) (e_int (-1)) in
|
||||||
|
ok ()
|
||||||
|
in
|
||||||
ok ()
|
ok ()
|
||||||
|
|
||||||
let declarations () : unit result =
|
let declarations () : unit result =
|
||||||
@ -635,13 +642,20 @@ let match_matej () : unit result =
|
|||||||
|
|
||||||
let mligo_list () : unit result =
|
let mligo_list () : unit result =
|
||||||
let%bind program = mtype_file "./contracts/list.mligo" in
|
let%bind program = mtype_file "./contracts/list.mligo" in
|
||||||
|
let%bind () =
|
||||||
let make_input n =
|
let make_input n =
|
||||||
e_pair (e_list [e_int n; e_int (2*n)])
|
e_pair (e_list [e_int n; e_int (2*n)])
|
||||||
(e_pair (e_int 3) (e_list [e_int 8])) in
|
(e_pair (e_int 3) (e_list [e_int 8])) in
|
||||||
let make_expected n =
|
let make_expected n =
|
||||||
e_pair (e_typed_list [] t_operation)
|
e_pair (e_typed_list [] t_operation)
|
||||||
(e_pair (e_int (n+3)) (e_list [e_int (2*n)]))
|
(e_pair (e_int (n+3)) (e_list [e_int (2*n)]))
|
||||||
in expect_eq_n program "main" make_input make_expected
|
in
|
||||||
|
expect_eq_n program "main" make_input make_expected
|
||||||
|
in
|
||||||
|
let%bind () = expect_eq_evaluate program "x" (e_list []) in
|
||||||
|
let%bind () = expect_eq_evaluate program "y" (e_list @@ List.map e_int [3 ; 4 ; 5]) in
|
||||||
|
let%bind () = expect_eq_evaluate program "z" (e_list @@ List.map e_int [2 ; 3 ; 4 ; 5]) in
|
||||||
|
ok ()
|
||||||
|
|
||||||
let lambda_mligo () : unit result =
|
let lambda_mligo () : unit result =
|
||||||
let%bind program = mtype_file "./contracts/lambda.mligo" in
|
let%bind program = mtype_file "./contracts/lambda.mligo" in
|
||||||
|
Loading…
x
Reference in New Issue
Block a user