On Sep 11, 2009, at 8:17 PM, Eduardo Cavazos wrote:

By the way, it would be nice if it looked like this:

(define fib
 (ifte (less-than= 1)
       (constant 1)
       (bi (uni (sub 1) fib)
           (uni (sub 2) fib) +)))

I.e. without the lambdas used for quoting the recursive fibs. But of course, this version triggers an error because 'fib' doesn't exist at definition time.

Any suggestions for this?

Change it to:

(define (fib x)
  ((ifte (less-than= 1)
     (constant 1)
     (bi (uni (sub 1) fib)
         (uni (sub 2) fib) +))
   x))

and now you get:

> (pretty-print
    (expand/optimize
      '(let ()
         (define (bi f g c)
          (lambda (x)
            (c (f x)
               (g x))))
         (define (uni f c)
          (lambda (x)
            (c (f x))))
         (define (sub x)
          (lambda (y)
            (- y x)))
         (define (constant x)
          (lambda (y)
            x))
         (define (ifte f g h)
          (lambda (x)
            (if (f x)
                (g x)
                (h x))))
         (define (less-than= x)
          (lambda (y)
            (<= y x)))
         (define (fib x)
           ((ifte (less-than= 1)
              (constant 1)
              (bi (uni (sub 1) fib)
                  (uni (sub 2) fib) +))
            x))
         (time (fib 34)))))

(letrec ((fib_0
          (lambda (x_1)
            (if (<= x_1 '1)
                '1
                (+ (fib_0 (- x_1 '1)) (fib_0 (- x_1 '2)))))))
  (time-it '"(fib 34)"
    (lambda () (+ (fib_0 '33) (fib_0 '32)))))

Cute, no?

Aziz,,,

Reply via email to