(* ****** ****** *) // #include "share/atspre_define.hats" // defines some names #include "share/atspre_staload.hats" // for targeting C #include "share/HATS/atspre_staload_libats_ML.hats" // for ... // (* ****** ****** *) // extern fun Power_set(xs: list0(int)): void // (* ****** ****** *) // Helper: fast power function. fun power(n: int, p: int): int = if p = 1 then n else if p = 0 then 1 else if p % 2 = 0 then power(n*n, p/2) else n * power(n, p-1) fun print_list(list: list0(int)): void = case+ list of | nil0() => println!(" ") | cons0(car, crd) => let val () = begin print car; print ','; end val () = print_list(crd) in end fun get_list_length(list: list0(int), length: int): int = case+ list of | nil0() => length | cons0(car, crd) => get_list_length(crd, length+1) fun get_list_from_bit_mask(mask: int, list: list0(int), result: list0(int)): list0(int) = if mask = 0 then result else case+ list of | nil0() => result | cons0(car, crd) => let val current: int = mask % 2 in if current = 0 then get_list_from_bit_mask(mask >> 1, crd, result) else get_list_from_bit_mask(mask >> 1, crd, list0_cons(car, result)) end implement Power_set(xs) = let val len: int = get_list_length(xs, 0) val pow: int = power(2, len) fun loop(mask: int, list: list0(int)): void = if mask > 0 && mask >= pow then () else let val () = print_list(get_list_from_bit_mask(mask, list, list0_nil())) in loop(mask+1, list) end in loop(0, xs) end (* ****** ****** *) implement main0() = let val xs: list0(int) = cons0(1, list0_pair(2, 3)) in Power_set(xs) end (* end of [main0] *) (* ****** ****** *)