(define-syntax iterate (syntax-rules () ; No final expression ((iterate loop (fold-vars ...) ((state-var init) ...) body) (iterate loop (fold-vars ...) ((state-var init) ...) body (values state-var ...))) ; Weird degenerate case with no iteration variables. ((iterate loop () ((state-var init) ...) body final) (let loop ((state-var init) ...) body)) ; All there ((iterate loop ((type value-var args ...) ...) ((state-var init) ...) body final) ((folder ((type value-var args ...) ...) (state-var ...) loop body) (lambda (state-var ...) final) args ... ... init ...))))