git » jacl.git » commit 0d30e5e

Add MV prototype

author Alan Dipert
2020-07-06 02:59:12 UTC
committer Alan Dipert
2020-07-06 02:59:12 UTC
parent 46f96c07ad0cc3b134f6f7bb01a6a5fed6267928

Add MV prototype

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