#lang racket (provide (except-out (all-from-out racket) define) (rename-out [define-lazy define])) (define-syntax define/forces (syntax-rules () [(define/forces (df x0 x ...) (gen ...) body) (define/forces (df x ...) (gen ... [x0 dx0]) body)] [(define/forces (df) ([x dx] ...) body) (define (df dx ...) (define-syntax x (syntax-id-rules () [x (force dx)])) ... body)])) (define-syntax define-lazy (syntax-rules (lambda) [(define-lazy (f x ...) body) (begin (define-syntax-rule (f x ...) (df (delay x) ...)) (define/forces (df x ...) () body))] [(define-lazy f (lambda (x ...) body)) (define-lazy (f x ...) body)] [(define-lazy f other) (define f other)])) #| (define-lazy (f x y) (+ x 6)) (f 1 (/ 2 0)) ; 7 instead of an error |#