emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/async a2196f7 03/60: Add `async-let' macro


From: Stefan Monnier
Subject: [elpa] externals/async a2196f7 03/60: Add `async-let' macro
Date: Tue, 8 Oct 2019 10:11:27 -0400 (EDT)

branch: externals/async
commit a2196f7d8d579d41f856b3d66f320158f641898c
Author: John Wiegley <address@hidden>
Commit: John Wiegley <address@hidden>

    Add `async-let' macro
---
 async.el | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/async.el b/async.el
index 3798c95..a280d3d 100644
--- a/async.el
+++ b/async.el
@@ -298,6 +298,34 @@ returns nil.  It can still be useful, however, as an 
argument to
   "Evaluate FUNC in a separate Emacs process, synchronously."
   `(async-get (async-start ,func)))
 
+(defun async--fold-left (f z xs)
+  (let ((res z))
+    (dolist (x xs)
+      (setq res (funcall f res x)))
+    res))
+
+(defmacro async-let (bindings forms)
+  "Implements `let', but each binding is established asynchronously.
+For example:
+
+  (async-let ((x (foo))
+              (y (bar)))
+     (message "%s %s" x y))
+
+    expands to ==>
+
+  (async-start (foo)
+   (lambda (x)
+     (async-start (bar)
+      (lambda (y)
+        (message "%s %s" x y)))))"
+  (async--fold-left
+   (lambda (acc binding)
+     `(async-start ,(cadr binding)
+                   (lambda (,(car binding))
+                     ,acc)))
+   forms (reverse bindings)))
+
 (provide 'async)
 
 ;;; async.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]