(let-syntax ((foo (syntax-rules () ((_) (letrec-syntax ((bar (macro-rules () ((_ recur x) (where (= x 0)) 0) ((_ recur x) `(+ 1 (,recur ,recur ,(- x 1))))))) (bar bar 5)))))) (foo)) ;; Much more fun: no need to pass the macro its own name (let-syntax ((foo (syntax-rules () ((_) (letrec-syntax ((bar (syntax-rules .. () ((_) 0) ((_ x rest ..) (+ 1 (bar rest ..)))))) (bar 1 2 3 4 5)))))) (foo))