From 8af3e1848cbdc570b6c173480c2988a552f3f74d Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Mon, 2 Mar 2015 16:41:59 -0800 Subject: [PATCH] Add cl-iter-defun * lisp/emacs-lisp/cl-macs.el (cl-iter-defun): Add cl-iter-defun. --- doc/misc/cl.texi | 7 +++++++ lisp/ChangeLog | 2 ++ lisp/emacs-lisp/cl-macs.el | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/doc/misc/cl.texi b/doc/misc/cl.texi index 052ca6bd786..c6076babacd 100644 --- a/doc/misc/cl.texi +++ b/doc/misc/cl.texi @@ -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., diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5018ca4b9de..aae09fda38f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,7 @@ 2015-03-03 Daniel Colascione + * 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. diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el index c3da091fb00..36f263cd20a 100644 --- a/lisp/emacs-lisp/cl-macs.el +++ b/lisp/emacs-lisp/cl-macs.el @@ -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. -- 2.39.2