abst@ype T
typedef List =
{X:type} (X, (T, X) -<cloref> X) -<cloref> X
val Nil = lam{X:type} (nil:X, cons: (T, X) -<cloref> X) =<cloref> nil
val Cons = lam (x: T, xs: List) =<cloref>
lam{X:type} (nil:X, cons: (T, X) -<cloref> X) =<cloref> cons (x, xs{X}(nil, cons))
extern fun List_append (xs: List, ys: List):<> List
implement List_append (xs, ys) = xs {List} (ys, Cons)
extern fun List_reverse (xs: List):<> List
implement List_reverse (xs) =
xs {List} (Nil, lam (_x, _xs) => List_append (_xs, Cons (_x, Nil)))
assume T = int
typedef int = intptr
val _0 = intptr_of_int 0
val _1 = intptr_of_int 1
fn List_length (xs: List):<> int = xs {int} (_0, lam (_x, _xs) => _xs + _1)
fn list_of_List (xs: List): list0 T = let
typedef X = list0 T
val nil = list0_nil : X
val cons = lam (_x: T, _xs: X) =<cloref> list0_cons (_x, _xs)
in
xs {X} (nil, cons)
end
fn List_print (xs: List): void = let
val nil = unit ()
val cons = lam (_x: T, _xs: unit) =<cloref> $effmask_all (print _x; print_newline (); _xs)
val unit () = xs {unit} (nil, cons)
in
end
val xs123 = Cons (1, Cons (2, Cons (3, Nil))) : List
val () = begin
print "length of xs123 = "; print (List_length xs123); print_newline ()
end
val () = print "xs123 =\n"
val () = List_print xs123
val xs321 = List_reverse (xs123)
val () = print "xs321 =\n"
val () = List_print xs321
val xs123123 = List_append (xs123, xs123)
val () = print "xs123123 =\n"
val () = List_print xs123123
implement main () = ()