(define-syntax multiple-value-set! (syntax-rules () ((multiple-value-set! vars vals-form) (gen-temps vars () vars vals-form)))) ;; auxiliary macro for multiple-value-set! (define-syntax emit-cwv-form (syntax-rules () ((emit-cwv-form temps asgns vals-form) (call-with-values (lambda () vals-form) (lambda temps . asgns))))) (define-syntax gen-temps (syntax-rules () ((gen-temps () temps vars-for-gen-sets vals-form) (gen-sets temps temps vars-for-gen-sets () vals-form)) ((gen-temps (v . vs) temps vars-for-gen-sets vals-form) (gen-temps vs (temp . temps) vars-for-gen-sets vals-form)))) (define-syntax gen-sets (syntax-rules () ((gen-sets temps () () asgns vals-form) (emit-cwv-form temps asgns vals-form)) ((gen-sets temps (temp . temps*) (v . vs) asgns vals-form) (gen-sets temps temps* vs ((set! v temp) . asgns) vals-form))))