2019-11-04 19:06:18 +00:00
|
|
|
(* Test loops in CameLIGO *)
|
|
|
|
|
|
|
|
let aux_simple (i: int) : bool * int =
|
|
|
|
if i < 100 then continue (i + 1) else stop i
|
|
|
|
|
|
|
|
let counter_simple (n: int) : int =
|
2019-11-20 12:16:31 +00:00
|
|
|
Loop.fold_while aux_simple n
|
2019-11-04 19:06:18 +00:00
|
|
|
|
|
|
|
type sum_aggregator = {
|
|
|
|
counter : int ;
|
|
|
|
sum : int ;
|
|
|
|
}
|
|
|
|
|
|
|
|
let counter (n : int) : int =
|
|
|
|
let initial : sum_aggregator = { counter = 0 ; sum = 0 } in
|
2019-11-20 12:16:31 +00:00
|
|
|
let out : sum_aggregator = Loop.fold_while (fun (prev: sum_aggregator) ->
|
2019-11-04 19:06:18 +00:00
|
|
|
if prev.counter <= n then
|
|
|
|
continue ({ counter = prev.counter + 1 ; sum = prev.counter + prev.sum })
|
|
|
|
else
|
2020-01-08 20:58:26 +00:00
|
|
|
stop ({ counter = prev.counter ; sum = prev.sum }) )
|
|
|
|
initial in out.sum
|
2019-11-04 19:06:18 +00:00
|
|
|
|
|
|
|
let aux_nest (prev: sum_aggregator) : bool * sum_aggregator =
|
|
|
|
if prev.counter < 100 then
|
|
|
|
continue ({ counter = prev.counter + 1 ;
|
2019-11-20 12:16:31 +00:00
|
|
|
sum = prev.sum + Loop.fold_while aux_simple prev.counter})
|
2019-11-04 19:06:18 +00:00
|
|
|
else
|
|
|
|
stop ({ counter = prev.counter ; sum = prev.sum })
|
|
|
|
|
|
|
|
let counter_nest (n: int) : int =
|
|
|
|
let initial : sum_aggregator = { counter = 0 ; sum = 0 } in
|
2019-11-20 12:16:31 +00:00
|
|
|
let out : sum_aggregator = Loop.fold_while aux_nest initial
|
2019-11-04 19:06:18 +00:00
|
|
|
in out.sum
|