;;; CPSTAK -- A continuation-passing version of the TAK benchmark.
;;; A good test of first class procedures and tail recursion.
 
(library (rnrs-benchmarks cpstak)
  (export main)
  (import (rnrs) (rnrs-benchmarks))
  
  (define (cpstak x y z)
  
    (define (tak x y z k)
      (if (not (< y x))
          (k z)
          (tak (- x 1)
               y
               z
               (lambda (v1)
                 (tak (- y 1)
                      z
                      x
                      (lambda (v2)
                        (tak (- z 1)
                             x
                             y
                             (lambda (v3)
                               (tak v1 v2 v3 k)))))))))
  
    (tak x y z (lambda (a) a)))
  
  (define (main . args)
    (run-benchmark
      "cpstak"
      cpstak-iters
      (lambda (result) (equal? result 7))
      (lambda (x y z) (lambda () (cpstak x y z)))
      18
      12
      6)))