Being able to write new control structures is something I miss in most languages. Lisp macros make it much easier to do that. Tcl uplevel and upvar are another way to approach it.
(defmacro ?= (symbol-or-symbols expr)
(let* ((symbols (etypecase symbol-or-symbols
(cons symbol-or-symbols)
(symbol (list symbol-or-symbols))))
(tmps (loop :for s :in symbols :collect (gensym (symbol-name s))))
(err (gensym "ERROR")))
`(multiple-value-bind (,@tmps ,err) ,expr
(if (not (null ,err))
(return ,err)
(setf (values ,@symbols) (values ,@tmps))))))