#lang racket (define (fib n) (if (<= n 1) 1 (+ (fib (- n 1)) (fib (- n 2))))) (define (fill v n) (if (<= n 0) null (cons v (fill v (- n 1))))) (define (fill-thunk th n) (if (<= n 0) null (cons (th) (fill-thunk th (- n 1))))) ; PROMISES (define (zdelay th) (mcons #f th)) (define (zforce p) (if (mcar p) (mcdr p) (begin (set-mcar! p #t) (set-mcdr! p ((mcdr p))) (mcdr p)))) (define (fill-promise p n) (if (<= n 0) null (cons (zforce p) (fill-promise p (- n 1))))) ; MEMO (define memo null) (define (fibmemo n) (if (<= n 1) 1 (let ([x (assoc n memo)]) (if x (cdr x) (let ([fn (+ (fibmemo (- n 1)) (fibmemo (- n 2)))]) (begin (set! memo (cons (cons n fn) memo)) fn)))))) (define-syntax mdelay (syntax-rules () [(mdelay e) (mcons #f (lambda () e))]))