author | Alan Dipert
<alan@dipert.org> 2020-09-02 03:51:06 UTC |
committer | Alan Dipert
<alan@dipert.org> 2020-09-02 03:51:06 UTC |
parent | 97a2fcd92e06443eba43c337b9bfc84c8448952f |
mv.lisp | +59 | -62 |
diff --git a/mv.lisp b/mv.lisp index 814a6a4..bf44a35 100644 --- a/mv.lisp +++ b/mv.lisp @@ -32,73 +32,70 @@ vars)) (defmacro mv-bind (vars expr &body body) - (let ((val1# (gensym))) - `(let* ((*mv-expected* ,(length vars)) - (,val1# ,expr)) - (let ,(make-mv-bindings vars val1#) - ,@body)))) - -(multiple-value-bind* (x) nil + (if (null vars) + `(progn () (progn ,expr nil) ,@body) + (let ((val1# (gensym))) + `(let* ((*mv-expected* ,(length vars)) + (,val1# ,expr)) + (let ,(make-mv-bindings vars val1#) + ,@body))))) + +(mv-bind (x) nil (format t "x = ~A~%" x)) -(multiple-value-bind* (x) 123 +(mv-bind (x) 123 (format t "x = ~A~%" x)) -(multiple-value-bind* (x y) (values* 1 2 3) +(mv-bind (x y) (mv 1 2 3) (format t "x = ~A, y = ~A~%" x y)) -(multiple-value-bind* (x y) ((lambda () (values* 1 2 3))) +(mv-bind (x y) ((lambda () (mv 1 2 3))) (format t "x = ~A, y = ~A~%" x y)) - -(multiple-value-list* (foo)) - - - - - -;; - -(defun values* (&rest 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# (let ((*values* (if (boundp '*values*) - *values* - (make-array '(20) :fill-pointer 0)))) - ,mv-form))) - (if (eq ,values# *values*) - (prog () ,@(loop - for v in vars - for i upfrom 0 - collect `(when (> (length ,values#) ,i) - (setq ,v (elt ,values# ,i))))) - ,(when (> (length vars) 0) - `(prog () (setq ,(first vars) ,values#)))) - ,@body))) - -(format t "~A~%" (multiple-value-bind* () nil)) - -(multiple-value-bind* (x) nil - (format t "x = ~A~%" x)) - -(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)) +(mv-list (foo)) + +;; ;; + +;; (defun values* (&rest 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# (let ((*values* (if (boundp '*values*) +;; *values* +;; (make-array '(20) :fill-pointer 0)))) +;; ,mv-form))) +;; (if (eq ,values# *values*) +;; (prog () ,@(loop +;; for v in vars +;; for i upfrom 0 +;; collect `(when (> (length ,values#) ,i) +;; (setq ,v (elt ,values# ,i))))) +;; ,(when (> (length vars) 0) +;; `(prog () (setq ,(first vars) ,values#)))) +;; ,@body))) + +;; (format t "~A~%" (multiple-value-bind* () nil)) + +;; (multiple-value-bind* (x) nil +;; (format t "x = ~A~%" x)) + +;; (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))