Add cl-iter-defun

* lisp/emacs-lisp/cl-macs.el (cl-iter-defun): Add cl-iter-defun.
This commit is contained in:
Daniel Colascione 2015-03-02 16:41:59 -08:00
parent 8f0f8c166c
commit 8af3e1848c
3 changed files with 30 additions and 0 deletions

View 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.,

View 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.

View 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.