aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog5
-rw-r--r--lisp/emacs-lisp/generator.el14
2 files changed, 15 insertions, 4 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 4ab4406dba1..5018ca4b9de 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,8 @@
12015-03-03 Daniel Colascione <dancol@dancol.org>
2
3 * emacs-lisp/generator.el (iter-defun): Correctly propagate
4 docstrings and declarations to underlying function.
5
12015-03-02 Daniel Colascione <dancol@dancol.org> 62015-03-02 Daniel Colascione <dancol@dancol.org>
2 7
3 * emacs-lisp/generator.el: New file. 8 * emacs-lisp/generator.el: New file.
diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el
index 4e21e792406..bb9fcff1408 100644
--- a/lisp/emacs-lisp/generator.el
+++ b/lisp/emacs-lisp/generator.el
@@ -674,10 +674,16 @@ encapsulates the state of a computation that produces a sequence
674of values. Callers can retrieve each value using `iter-next'." 674of values. Callers can retrieve each value using `iter-next'."
675 (declare (indent defun)) 675 (declare (indent defun))
676 (cl-assert lexical-binding) 676 (cl-assert lexical-binding)
677 `(defun ,name ,arglist 677 (let (preamble)
678 ,(cps-generate-evaluator 678 (when (stringp (car body))
679 `(cl-macrolet ((iter-yield (value) `(cps-internal-yield ,value))) 679 (push (pop body) preamble))
680 ,@body)))) 680 (when (eq (car-safe (car body)) 'declare)
681 (push (pop body) preamble))
682 `(defun ,name ,arglist
683 ,@(nreverse preamble)
684 ,(cps-generate-evaluator
685 `(cl-macrolet ((iter-yield (value) `(cps-internal-yield ,value)))
686 ,@body)))))
681 687
682(defmacro iter-lambda (arglist &rest body) 688(defmacro iter-lambda (arglist &rest body)
683 "Return a lambda generator. 689 "Return a lambda generator.