]> git.eshelyaron.com Git - emacs.git/commitdiff
Add cl-iter-defun
authorDaniel Colascione <dancol@dancol.org>
Tue, 3 Mar 2015 00:41:59 +0000 (16:41 -0800)
committerDaniel Colascione <dancol@dancol.org>
Tue, 3 Mar 2015 00:41:59 +0000 (16:41 -0800)
* lisp/emacs-lisp/cl-macs.el (cl-iter-defun): Add cl-iter-defun.

doc/misc/cl.texi
lisp/ChangeLog
lisp/emacs-lisp/cl-macs.el

index 052ca6bd7869b5daec6090cc5f9601626828086c..c6076babacda4dcb54e50330696a70233b47282a 100644 (file)
@@ -296,6 +296,13 @@ list.  Also, the function body is enclosed in an implicit block
 called @var{name}; @pxref{Blocks and Exits}.
 @end defmac
 
+@defmac cl-iter-defun name arglist body@dots{}
+This form is identical to the regular @code{iter-defun} form, except
+that @var{arglist} is allowed to be a full Common Lisp argument
+list.  Also, the function body is enclosed in an implicit block
+called @var{name}; @pxref{Blocks and Exits}.
+@end defmac
+
 @defmac cl-defsubst name arglist body@dots{}
 This is just like @code{cl-defun}, except that the function that
 is defined is automatically proclaimed @code{inline}, i.e.,
index 5018ca4b9deecc16eff77314b18fbb5fb5a3ebb0..aae09fda38f3f2ec00d9f10c0d23e428521dcbfd 100644 (file)
@@ -1,5 +1,7 @@
 2015-03-03  Daniel Colascione  <dancol@dancol.org>
 
+       * emacs-lisp/cl-macs.el (cl-iter-defun): Add cl-iter-defun.
+
        * emacs-lisp/generator.el (iter-defun): Correctly propagate
        docstrings and declarations to underlying function.
 
index c3da091fb0050b3754237fce621745716517d4c1..36f263cd20a121e2adf3001cb4518d6babde8b42 100644 (file)
@@ -301,6 +301,27 @@ and BODY is implicitly surrounded by (cl-block NAME ...).
         (form `(defun ,name ,@(cdr res))))
     (if (car res) `(progn ,(car res) ,form) form)))
 
+;;;###autoload
+(defmacro cl-iter-defun (name args &rest body)
+  "Define NAME as a generator function.
+Like normal `iter-defun', except ARGLIST allows full Common Lisp conventions,
+and BODY is implicitly surrounded by (cl-block NAME ...).
+
+\(fn NAME ARGLIST [DOCSTRING] BODY...)"
+  (declare (debug
+            ;; Same as iter-defun but use cl-lambda-list.
+            (&define [&or name ("setf" :name setf name)]
+                     cl-lambda-list
+                     cl-declarations-or-string
+                     [&optional ("interactive" interactive)]
+                     def-body))
+           (doc-string 3)
+           (indent 2))
+  (require 'generator)
+  (let* ((res (cl--transform-lambda (cons args body) name))
+         (form `(iter-defun ,name ,@(cdr res))))
+    (if (car res) `(progn ,(car res) ,form) form)))
+
 ;; The lambda list for macros is different from that of normal lambdas.
 ;; Note that &environment is only allowed as first or last items in the
 ;; top level list.