(defmacro once-only-list ((syms initforms) &body body) (alexandria:once-only (initforms) `(let ((,syms (mapcar (lambda (x) (declare (ignore x)) (gensym)) ,initforms))) `(let (,@(loop for sym in ,syms for initform in ,initforms collect `(,sym ,initform))) ,,@body)))) (defmacro fbind ((&rest bindings) &body body) (let ((names (mapcar #'first bindings)) (initforms (mapcar #'second bindings))) (once-only-list (funs initforms) `(flet ,(mapcar (lambda (name fun) `(,name (&rest args) (apply ,fun args))) names funs) ,@body))))