// some examples on CPS transformation staload "ATS/stdio.sats" datatype answer_t = | ANSint of Int fun fprint_ans (a: answer_t, out: FILE): unit = case a of | ANSint i => begin fprint_string ("ANSint(", out); fprint_int (i, out); fprint_string (")", out) end fun print_ans (a: answer_t): unit = fprint_ans (a, stdout) fun fact (n: Nat): Nat = if n igt 0 then n nmul fact (ipred n) else 1 fun fact_k (n: Nat, k: Nat -> answer_t): answer_t = if n igt 0 then fact_k (ipred n, lam res => k (n nmul res)) else k (1) val _ = begin print_string "fact 10 = "; print_int (fact 10); print_newline () end val _ = begin print_string "fact_k 10 = "; print_ans (fact_k (10, lam res => ANSint res)); print_newline () end fun fib (n: Nat): Nat = if n igte 2 then fib (n isub 1) iadd fib (n isub 2) else n fun fib_k (n: Nat, k: Nat -> answer_t): answer_t = if n igte 2 then fib_k (n isub 1, lam res1 => fib_k (n isub 2, lam res2 => k (res1 iadd res2))) else k (n) val _ = begin print_string "fib 10 = "; print_int (fib 10); print_newline () end val _ = begin print_string "fib_k 10 = "; print_ans (fib_k (10, lam res => ANSint res)); print_newline () end