1*37da2899SCharles.Forsythimplement Ackermann; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsyth sys: Sys; 5*37da2899SCharles.Forsythinclude "draw.m"; 6*37da2899SCharles.Forsyth draw: Draw; 7*37da2899SCharles.Forsyth 8*37da2899SCharles.ForsythAckermann: module 9*37da2899SCharles.Forsyth{ 10*37da2899SCharles.Forsyth init: fn(ctxt: ref Draw->Context, argv: list of string); 11*37da2899SCharles.Forsyth}; 12*37da2899SCharles.Forsyth 13*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string) 14*37da2899SCharles.Forsyth{ 15*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 16*37da2899SCharles.Forsyth draw = load Draw Draw->PATH; 17*37da2899SCharles.Forsyth argv = tl argv; # remove program name 18*37da2899SCharles.Forsyth m := n := 0; 19*37da2899SCharles.Forsyth if(argv != nil){ 20*37da2899SCharles.Forsyth m = int hd argv; 21*37da2899SCharles.Forsyth argv = tl argv; 22*37da2899SCharles.Forsyth } 23*37da2899SCharles.Forsyth if(m < 0) 24*37da2899SCharles.Forsyth m = 0; 25*37da2899SCharles.Forsyth if(argv != nil) 26*37da2899SCharles.Forsyth n = int hd argv; 27*37da2899SCharles.Forsyth if(n < 0) 28*37da2899SCharles.Forsyth n = 0; 29*37da2899SCharles.Forsyth t0 := sys->millisec(); 30*37da2899SCharles.Forsyth a := ack(m, n); 31*37da2899SCharles.Forsyth t1 := sys->millisec(); 32*37da2899SCharles.Forsyth sys->print("A(%d, %d) = %d (t = %d ms)\n", m, n, a, t1-t0); 33*37da2899SCharles.Forsyth} 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsythack(m, n: int) : int 36*37da2899SCharles.Forsyth{ 37*37da2899SCharles.Forsyth if(m == 0) 38*37da2899SCharles.Forsyth return n+1; 39*37da2899SCharles.Forsyth else if(n == 0) 40*37da2899SCharles.Forsyth return ack(m-1, 1); 41*37da2899SCharles.Forsyth else 42*37da2899SCharles.Forsyth return ack(m-1, ack(m, n-1)); 43*37da2899SCharles.Forsyth} 44