home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / draco / draco-1.ark / ACK.DRC next >
Text File  |  1986-11-12  |  1KB  |  47 lines

  1. \util.g
  2.  
  3. /*
  4.  * ACK - simple program to calculate Ackerman's function.
  5.  */
  6.  
  7. /*
  8.  * Note that we lie and cheat here!!!!!! I, the author of the compiler,
  9.  * KNOW that it's OK to say 'nonrec' in THIS recursive procedure.
  10.  * Basically, the key is that after the recursive calls, none of the
  11.  * parameters (or locals if there were any) are needed again. Take a look
  12.  * at the disassembled code to see what is happening here.
  13.  */
  14.  
  15. proc nonrec ack(int m, n)int:
  16.  
  17.     if m = 0 then
  18.     n + 1
  19.     elif n = 0 then
  20.     ack(m - 1, 1)
  21.     else
  22.     ack(m - 1, ack(m, n - 1))
  23.     fi
  24. corp;
  25.  
  26. proc nonrec usage()void:
  27.  
  28.     writeln("Use is: ack m n     m & n are positive integers");
  29.     exit(1);
  30. corp;
  31.  
  32. proc nonrec main()void:
  33.     channel input text chin;
  34.     int m, n;
  35.  
  36.     open(chin, GetPar());
  37.     if not read(chin; m) or m < 0 then
  38.     usage();
  39.     fi;
  40.     open(chin, GetPar());
  41.     if not read(chin; n) or n < 0 then
  42.     usage();
  43.     fi;
  44.     /* we write a BEL at the end, since this can be kinda slooooooow */
  45.     writeln("Ack(", m, ", ", n, ") = ", ack(m, n), '\(0x07)');
  46. corp;
  47.