git » jacl.git » commit 4275223

mv experiments

author Alan Dipert
2020-09-02 03:51:06 UTC
committer Alan Dipert
2020-09-02 03:51:06 UTC
parent 97a2fcd92e06443eba43c337b9bfc84c8448952f

mv experiments

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))