(trace-define-syntax my-let (syntax-rules () [(_ ((x v) ...) e1 e2 ...) ((lambda (x ...) e1 e2 ...) v ...)])) '(define a 6) '(my-let ([a 3][b (+ a 1)]) (list a b)) (define-syntax my-if (syntax-rules (then else) [(_ e1 then e2) (if e1 e2)] [(_ e1 then e2 else e3) (if e1 e2 e3)])) (define-syntax ++ ; (++ a) like ++a in Java or C. (syntax-rules () [(_ x) (begin (set! x (+ 1 x)) x)])) (define-syntax ++-post ; like a++ in C or Java (syntax-rules () [(_ x) (let ([result x]) (set! x (+ 1 x)) result)])) (define-syntax for (syntax-rules (:) [(_ ((init ...) : test : update ...) body ...) (begin init ... (let loop () (when test body ... update ... (loop))))] [(_ (init : test : update ...) body ...) (for ((init) : test : update ...) body ...) ])) (define-syntax my-and (syntax-rules () [(_) #t] [(_ e) e] [(_ e1 e2 e3 ...) (if e1 (my-and e2 e3 ...) #f)])) (my-and)