author | Alan Dipert
<alan@dipert.org> 2020-07-06 02:59:12 UTC |
committer | Alan Dipert
<alan@dipert.org> 2020-07-06 02:59:12 UTC |
parent | 46f96c07ad0cc3b134f6f7bb01a6a5fed6267928 |
mv.lisp | +24 | -0 |
diff --git a/mv.lisp b/mv.lisp new file mode 100644 index 0000000..2ebb9aa --- /dev/null +++ b/mv.lisp @@ -0,0 +1,24 @@ +(defvar *values* (make-array '(20) :fill-pointer 0)) + +(defun values* (&rest values) + (setf (fill-pointer *values*) 20) + (loop + for v in values + for i upfrom 0 + do (setf (elt *values* i) v) + finally (progn (setf (fill-pointer *values*) (1+ i)) + (return *values*)))) + +(defmacro multiple-value-bind* (vars mv-form &body body) + (let ((values# (gensym))) + `(let (,@(mapcar #'list vars) + (,values# ,mv-form)) + (if (eq ,values# *values*) + (progn ,@(loop + for v in vars + for i upfrom 0 + collect `(when (> (length ,values#) ,i) + (setq ,v (elt ,values# ,i))))) + ,(when (> (length vars) 0) + `(setq ,(first vars) ,values#))) + ,@body)))