(define ((return val) curr_counter) (cons curr_counter val)) (define ((>>= m f) c) (let* ((mr (m c))) ((f (cdr mr)) (car mr)))) (define (incr n) (cons (+ 1 n) n)) (define (runM m c) (m c)) (define (make-node val kids) (>>= incr (lambda (c) (return (cons (cons c val) kids))))) (letrec-syntax ((letM (syntax-rules () ( (letM ((name initializer)) expression); (>>= initializer (lambda (name) expression))))) (letM* (syntax-rules () ((letM* (h . tail) expr) (letM (h) (letM* tail expr))); ((letM* () expr) expr)))) (letrec ((build-btree (lambda (depth) (if (zero? depth) (make-node depth '()) (letM* ((lt (build-btree (- depth 1))) (rt (build-btree (- depth 1)))) (make-node depth (list lt rt))))))) (runM (build-btree 3) 100)) )