(defun bind-eval (vars values code)
  (let* ((src (format nil "(lambda ~a ~a)" vars code))
         (fun (eval (read-from-string src))))
    (apply fun values)))

(defmacro ceval (vars code)
  (loop :for var :in vars
        :collect var :into vars
        :collect var :into values
        :finally (return
                  `(bind-eval (quote ,vars)
                              (list  ,@values)
                              ,code))))

(defun test (x)
  (let ((y 1))
    (ceval (y) x)))

(print (test 'y))