Macro Doubts

#!r6rs
(import (rnrs))


(define get-val 'temp)

(define-syntax substitute
  (lambda (x)
    (syntax-case x ()
      [(substitute v e)
       #'(begin (set! get-val v) e)])))

(define-syntax _
  (make-variable-transformer
   (lambda (x)
     (syntax-case x ()
       [id (identifier? #'id) #'get-val]))))

(display (substitute 3 (+ 4 1 _ 1 5)))
;; => 14

> _ 
3

How do I keep the substitution local to the expression. How do I not have the get-val identfier. Better way to do this?