#lang racket (provide (all-defined-out)) (define (zif e1 e2 e3) (if e1 e2 e3)) (define-syntax zmif (syntax-rules (then else) [(zmif e1 then e2 else e3) (if e1 e2 e3)])) (define-syntax zdelay (syntax-rules () [(zdelay e) (mcons #f (lambda () e))])) (define (my-force p) (if (mcar p) (mcdr p) (begin (set-mcar! p #t) (set-mcdr! p ((mcdr p))) (mcdr p)))) (define (dbl1 x) (+ x x)) (define (dbl2 x) (* x 2)) (define-syntax mdbl1 (syntax-rules () [(mdbl1 x) (let ([y x]) (+ y y))])) (define-syntax mdbl2 (syntax-rules () [(mdbl2 x) (* x 2)]))