;;; FIBC -- FIB using first-class continuations, written by Kent Dybvig
(library (rnrs-benchmarks fibc)
(export main)
(import (rnrs) (rnrs-benchmarks))
(define (_1+ n) (+ n 1))
(define (_1- n) (- n 1))
;;; fib with peano arithmetic (using numbers) with call/cc
(define (addc x y k)
(if (zero? y)
(k x)
(addc (_1+ x) (_1- y) k)))
(define (fibc x c)
(if (zero? x)
(c 0)
(if (zero? (_1- x))
(c 1)
(addc (call-with-current-continuation (lambda (c) (fibc (_1- x) c)))
(call-with-current-continuation (lambda (c) (fibc (_1- (_1- x)) c)))
c))))
(define (main)
(run-benchmark
"fibc"
fibc-iters
(lambda (result) (equal? result 2584))
(lambda (x c) (lambda () (fibc x c)))
18
(lambda (n) n))))