#lang racket ; create some functions to track how often something ; is used. It modifies a global state variable. (define global-eval-count 0) (define (reset-count) (set! global-eval-count 0)) (define (get-count) global-eval-count) (define (inc-count) (set! global-eval-count (+ 1 global-eval-count)) (displayln (format "eval count ~a" global-eval-count)) ) ; define syntax for weak delay of expr. Returns a ; closure that when evaluated evaluates expr in the ; original context. (define-syntax-rule (w-delay expr) (lambda () (inc-count) ; for tracing purposes only expr )) ; define syntax for weak force of a delayed expr ; simply evaluates the lambda (define-syntax-rule (w-force thunk) (thunk) ) (define (test-it) (reset-count) (define v1 (w-delay (+ 40 2))) (displayln (w-force v1)) (displayln (w-force v1)) ; f1 assumes that w-y is a delayed expression (define (f1 n w-y) (if (= n 0) 1 (+ (w-force w-y) 1))) (define x 0) (display "on 0: ") (displayln (f1 0 (w-delay (/ 1 x)))) (display "on 1: ") (displayln (f1 1 (w-delay (/ 1 x)))) )