Another possibility: (let init-loop ((args init-args)) (unless (null? args) ((if (defined? (car args) env) let-set! varlet) env (car args) (cadr args)) (init-loop (cddr args))))) varlet adds a new binding to the let even if one already exists for the symbol (shadowing the old one).