// Ackermann function `export ack : Fn[m; n] $ ( t : `type m; ? |(t != `type n) { `panic "m and n must be the same type" } ? |(t = Int_signed; t = Float) { ? |(m < 0; n < 0) { `return 0 } } ? { m = 0 { n + 1 } &(m > 0; n = 0) { ack `sync (m - 1; 1) } { ack `sync (m - 1; ack `sync (m; n - 1)) } } ) `export ack_string : Fn[m; n] $ ( "#MAGENTA#ack#(#CYAN#%#, #CYAN#%#) #WHITE#=# #GREEN#%#\n" `format (m; n; ack `sync (m; n)) ) `is_main Fn $ ( ( args ) : `use "sys" ? 4 != `length args { `return `error String $ ( "#BOLD#RED#Got: %#\n" `format `join args "#BOLD#WHITE#Usage: % % #\n" `format (args `get 0; args `get 1) ) } `print ack_string `sync (U64 $ args `get -2; U64 $ args `get -1) )