#lang racket (require racket/trace) (define-syntax when (syntax-rules () [(_ e1 e2 ...) (if e1 (begin e2 ...) (void))])) (define-syntax unless (syntax-rules () [(_ e1 e2 ...) (when (not e1) e2 ...)])) (define-syntax mycond (syntax-rules (else) [(_ (else e1 e2 ...)) (begin e1 e2 ...)] [(_ (e0 e1 e2 ...)) (when e0 (begin e1 e2 ...))] [(_ (e0 e1 e2 ...) c1 c2 ...) (if e0 (begin e1 e2 ...) (mycond c1 c2 ...))])) (define foo (lambda (x) (mycond [(= x 0) 3 4 'foo] [(= x 42) 'boo] [(= x 77) 'boohooo]))) ; [else 'hello]))) (define-syntax mylet (syntax-rules () [(_ ((s1 e1) ...) b1 b2 ...) ; must have at least one body ((lambda (s1 ...) b1 b2 ...) e1 ...)])) (define-syntax mylet* (syntax-rules () [(_ () b1 b2 ...) (mylet () b1 b2 ...)] [(_ ((s1 e1) (s2 e2) ...) b1 b2 ...) (mylet ((s1 e1)) (mylet* ((s2 e2) ...) b1 b2 ...))])) (define-syntax myor (syntax-rules () [(_) #f] [(_ e) e] [(_ e1 e2 e3 ...) (let ([t e1]) (if t t (myor e2 e3 ...)))])) (define-syntax myand (syntax-rules () [(_) #t] [(_ e) e] [(_ e1 e2 ...) (if e1 (myand e2 ...) #f)]))