open LambdaCal (* 1. Can we implement recursion in terms of shift and reduce? Re recursion is an effect *) (* The term i want to define is: fix (\sum. (\x. if x = 0 then 0 else sum (x - 1))) Let us create the nameless representation fix (\. (\. if $0 = 0 then 0 else $0 + $1 ($0 - 1))) *) val args = CommandLine.arguments() val input_string = hd args val input_number = valOf (Int64.fromString input_string) val func_name = hd (tl args) val method_name = hd (tl (tl args)) local val cond = BuiltinApp (Equal, Var 0, Int 0) fun decrement x = BuiltinApp (Sub, x, Int 1) fun add x y = BuiltinApp (Sum, x, y) val branch = Branch (cond, Int 0, add (Int 1) (App (Var 1, decrement (Var 0)))) in fun sum input_number = App (Fix (Lambda branch), Int input_number) end (* The term i want to define is: fix (\sum. (\acc. \n. if n = 0 then acc else sum (acc + 1) (n - 1))) Let us create the nameless representation fix (\. (\. \. if $0 = 0 then $1 else $2 ($1 + $0) ($0 - 1))) *) local val cond = BuiltinApp (Equal, Var 0, Int 0) fun decrement x = BuiltinApp (Sub, x, Int 1) fun sum x y = BuiltinApp (Sum, x, y) val branch = Branch (cond, Var 1, App (App (Var 2, sum (Var 1) (Var 0)), decrement (Var 0))) in fun iter_sum input_number = App (App (Fix (Lambda (Lambda branch)), Int 0), Int input_number) end (* The term i want to define is: fix (\fib. (\x. if x < 2 then x else fib (x - 1) + fib (x - 2))) Let us create the nameless representation fix (\. (\. if $0 < 2 then $0 else $1 ($0 - 1) + $1 ($0 - 2))) *) local val cond = BuiltinApp (LessThan, Var 0, Int 2) fun sub x y = BuiltinApp (Sub, x, y) val fib_minus_1 = App (Var 1, sub (Var 0) (Int 1)) val fib_minus_2 = App (Var 1, sub (Var 0) (Int 2)) val recursive_case = BuiltinApp (Sum, fib_minus_1, fib_minus_2) val branch = Branch (cond, Var 0, recursive_case) in fun fib input_number = App (Fix (Lambda branch), Int input_number) end exception InvalidAlgo val algo = case func_name of "sum" => sum | "fib" => fib | "iter_sum" => iter_sum | _ => raise InvalidAlgo val term = algo input_number val timer = Timer.startCPUTimer() val _ = LambdaCal.pretty_print_value (LambdaCal.evaluate term) val _ = print ((Int64.toString input_number) ^ " ") val {usr, sys} = Timer.checkCPUTimer timer val tot = Time.+ (usr, sys) fun showMs t = Time.toString t val _ = print (showMs tot) val _ = print "\n"