author | Alan Dipert
<alan@dipert.org> 2020-07-06 03:22:58 UTC |
committer | Alan Dipert
<alan@dipert.org> 2020-07-06 03:22:58 UTC |
parent | 0d30e5e9e5d33ffb92f2285e467e3a8b961a7a63 |
mv.lisp | +31 | -15 |
diff --git a/mv.lisp b/mv.lisp index 2ebb9aa..1881e34 100644 --- a/mv.lisp +++ b/mv.lisp @@ -1,24 +1,40 @@ -(defvar *values* (make-array '(20) :fill-pointer 0)) +(defvar *values*) (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*)))) + (if (and (boundp '*values*) + (> (length values) 1)) + (progn + (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*)))) + (first values))) (defmacro multiple-value-bind* (vars mv-form &body body) (let ((values# (gensym))) `(let (,@(mapcar #'list vars) - (,values# ,mv-form)) + (,values# (let ((*values* (if (boundp '*values*) + *values* + (make-array '(20) :fill-pointer 0)))) + ,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))))) + (prog () ,@(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#))) + `(prog () (setq ,(first vars) ,values#)))) ,@body))) + +(multiple-value-bind* (x) 123 + (format t "x = ~A~%" x)) + +(multiple-value-bind* (x y) (values* 1 2 3) + (format t "x = ~A, y = ~A~%" x y)) + +(multiple-value-bind* (x y) ((lambda () (values* 1 2 3))) + (format t "x = ~A, y = ~A~%" x y))