// Ackermann function `export ack : Fn[m; n] $ ( t : `type m; ? |(t != `type n; t != Int[Any; Any; Any]) { `panic "m and n must be the same type of Int" } ? t = Int[Any; .signed; Any] { ? |(m < 0; n < 0) { `return 0 } } ? { m = 0 { n + 1 } &(m > 0; n = 0) { ack `sync (m - 1; 1) } &(m > 0; n > 0) { ack `sync (m - 1; ack `sync (m; n - 1)) } { 0 } } ) `export ack_string : Fn[m; n] $ ( String $ ("ack("; m; " "; n; ") = "; ack `sync (m; n); "\n") ) `is_main Fn $ ( ( args ) : `use "sys" ? 4 != `length args { `return `error String $ ( "Got: "; " " `join args; "\n" "Usage: "; args `get 0; " "; args `get 1; " \n" ) } `print ack_string `sync (I64 $ args `get -2; I64 $ args `get -1) )