futures: Support multiple-value returns.
authorLudovic Courtès <ludo@gnu.org>
Thu, 16 Dec 2010 16:38:32 +0000 (17:38 +0100)
committerLudovic Courtès <ludo@gnu.org>
Thu, 16 Dec 2010 22:45:24 +0000 (23:45 +0100)
* module/ice-9/futures.scm (process-future!): Use `call-with-values'
  when invoking `(future-thunk future)'.

* test-suite/tests/future.test ("futures")["multiple values"]: New test.

module/ice-9/futures.scm
test-suite/tests/future.test

index 0f1b0f1..742e124 100644 (file)
@@ -83,9 +83,10 @@ touched."
   (set-future-result! future
                       (catch #t
                         (lambda ()
-                          (let ((result ((future-thunk future))))
-                            (lambda ()
-                              result)))
+                          (call-with-values (future-thunk future)
+                            (lambda results
+                              (lambda ()
+                                (apply values results)))))
                         (lambda args
                           (lambda ()
                             (apply throw args)))))
index 440376d..e82b4e3 100644 (file)
                                            (iota 123)))))))
        (reduce + 0 (iota 123))))
 
+  (pass-if "multiple values"
+    (let ((lst (iota 123)))
+      (equal? (zip lst lst)
+              (map (lambda (f)
+                     (call-with-values (cut touch f) list))
+                   (map (lambda (i)
+                          (future (values i i)))
+                        lst)))))
+
   (pass-if "no exception"
     (future? (future (throw 'foo 'bar))))