emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master 5099b3a 1/2: dotimes-with-progress-reporter: Polymo


From: Tino Calancha
Subject: [Emacs-diffs] master 5099b3a 1/2: dotimes-with-progress-reporter: Polymorphic 2nd argument
Date: Sun, 17 Jun 2018 05:34:01 -0400 (EDT)

branch: master
commit 5099b3abb2b623ce949b8efc37bee8c41d5ad754
Author: Tino Calancha <address@hidden>
Commit: Tino Calancha <address@hidden>

    dotimes-with-progress-reporter: Polymorphic 2nd argument
    
    * lisp/subr.el (dotimes-with-progress-reporter): Allow 2nd arg to be
    a string or a progress reporter (Bug#31696).
    * doc/lispref/display.texi (node Progress): Update manual.
---
 doc/lispref/display.texi | 14 +++++++++++++-
 lisp/subr.el             | 38 ++++++++++++++++++++------------------
 2 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index 0ba7f0f..12c36bb 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -469,7 +469,7 @@ never print it, there are many good reasons for this not to 
happen.
 Secondly, @samp{done} is more explicit.
 @end defun
 
address@hidden dotimes-with-progress-reporter (var count [result]) message 
address@hidden
address@hidden dotimes-with-progress-reporter (var count [result]) 
reporter-or-message address@hidden
 This is a convenience macro that works the same way as @code{dotimes}
 does, but also reports loop progress using the functions described
 above.  It allows you to save some typing.
@@ -483,6 +483,18 @@ this macro this way:
     "Collecting some mana for Emacs..."
   (sit-for 0.01))
 @end example
+
+
+The second argument @code{reporter-or-message} might be a progress
+reporter object.  This is useful if you want to specify the optional
+arguments in @code{make-progress-reporter}.
+For instance, you can write previous example as follows:
address@hidden
+(dotimes-with-progress-reporter
+    (k 500)
+    (make-progress-reporter "Collecting some mana for Emacs..." 0 500 0 1 1.5)
+  (sit-for 0.01))
address@hidden example
 @end defmac
 
 @node Logging Messages
diff --git a/lisp/subr.el b/lisp/subr.el
index 8123e60..d4383f8 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -5039,32 +5039,34 @@ NEW-MESSAGE, if non-nil, sets a new message for the 
reporter."
   "Print reporter's message followed by word \"done\" in echo area."
   (message "%sdone" (aref (cdr reporter) 3)))
 
-(defmacro dotimes-with-progress-reporter (spec message &rest body)
+(defmacro dotimes-with-progress-reporter (spec reporter-or-message &rest body)
   "Loop a certain number of times and report progress in the echo area.
 Evaluate BODY with VAR bound to successive integers running from
 0, inclusive, to COUNT, exclusive.  Then evaluate RESULT to get
 the return value (nil if RESULT is omitted).
 
-At each iteration MESSAGE followed by progress percentage is
-printed in the echo area.  After the loop is finished, MESSAGE
-followed by word \"done\" is printed.  This macro is a
-convenience wrapper around `make-progress-reporter' and friends.
+REPORTER-OR-MESSAGE is a progress reporter object or a string.  In the latter
+case, use this string to create a progress reporter.
+
+At each iteration, print the reporter message followed by progress
+percentage in the echo area.  After the loop is finished,
+print the reporter message followed by word \"done\".
+
+This macro is a convenience wrapper around `make-progress-reporter' and 
friends.
 
 \(fn (VAR COUNT [RESULT]) MESSAGE BODY...)"
   (declare (indent 2) (debug ((symbolp form &optional form) form body)))
-  (let ((temp (make-symbol "--dotimes-temp--"))
-       (temp2 (make-symbol "--dotimes-temp2--"))
-       (start 0)
-       (end (nth 1 spec)))
-    `(let ((,temp ,end)
-          (,(car spec) ,start)
-          (,temp2 (make-progress-reporter ,message ,start ,end)))
-       (while (< ,(car spec) ,temp)
-        ,@body
-        (progress-reporter-update ,temp2
-                                  (setq ,(car spec) (1+ ,(car spec)))))
-       (progress-reporter-done ,temp2)
-       nil ,@(cdr (cdr spec)))))
+  (let ((prep (make-symbol "--dotimes-prep--"))
+        (end (make-symbol "--dotimes-end--")))
+    `(let ((,prep ,reporter-or-message)
+           (,end ,(cadr spec)))
+       (when (stringp ,prep)
+         (setq ,prep (make-progress-reporter ,prep 0 ,end)))
+       (dotimes (,(car spec) ,end)
+         ,@body
+         (progress-reporter-update ,prep (1+ ,(car spec))))
+       (progress-reporter-done ,prep)
+       (or ,@(cdr (cdr spec)) nil))))
 
 
 ;;;; Comparing version strings.



reply via email to

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