emacs-diffs
[Top][All Lists]
Advanced

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

Re: [Emacs-diffs] master e224c94: * lisp/emacs-lisp/seq.el (seq-doseq):


From: Nicolas Petton
Subject: Re: [Emacs-diffs] master e224c94: * lisp/emacs-lisp/seq.el (seq-doseq): Tighten the code
Date: Fri, 24 Apr 2015 23:06:37 +0200

Stefan Monnier writes:

> branch: master
> commit e224c9465dfe7033b11c0aeb830298c101c9bdcc
> Author: Stefan Monnier <address@hidden>
> Commit: Stefan Monnier <address@hidden>
>
>     * lisp/emacs-lisp/seq.el (seq-doseq): Tighten the code
>     
>     (seq-doseq): Fix out-of-scope binding.
>     Don't call `seq-length at every iteration.
>     Reduce `if's from 3 to 2 per iteration.
>     (emacs-lisp-mode-hook): Don't tweak in Emacsā‰„25.
> ---
>  doc/lispref/sequences.texi |    2 +-
>  lisp/emacs-lisp/seq.el     |   34 +++++++++++++++++-----------------
>  2 files changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi
> index e1330f7..b48fae4 100644
> --- a/doc/lispref/sequences.texi
> +++ b/doc/lispref/sequences.texi
> @@ -790,7 +790,7 @@ of type @var{type}.  @var{type} can be one of the 
> following symbols:
>  @end example
>  @end defun
>  
> address@hidden seq-doseq (var sequence [result]) address@hidden
> address@hidden seq-doseq (var sequence) address@hidden
>  @cindex sequence iteration
>    This macro is like @code{dolist}, except that @var{sequence} can be a list,
>  vector or string (@pxref{Iteration} for more information about the
> diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
> index 320ee20..b8647ec 100644
> --- a/lisp/emacs-lisp/seq.el
> +++ b/lisp/emacs-lisp/seq.el
> @@ -44,31 +44,28 @@
>  
>  (defmacro seq-doseq (spec &rest body)
>    "Loop over a sequence.
> -Similar to `dolist' but can be applied lists, strings and vectors.
> +Similar to `dolist' but can be applied to lists, strings, and vectors.
>  
>  Evaluate BODY with VAR bound to each element of SEQ, in turn.
> -Then evaluate RESULT to get return value, default nil.
>  
> -\(fn (VAR SEQ [RESULT]) BODY...)"
> +\(fn (VAR SEQ) BODY...)"
>    (declare (indent 1) (debug ((symbolp form &optional form) body)))
>    (let ((is-list (make-symbol "is-list"))
>          (seq (make-symbol "seq"))
>          (index (make-symbol "index")))
>      `(let* ((,seq ,(cadr spec))
> -            (,is-list (listp ,seq))
> +            (,length (if (listp ,seq) nil (seq-length ,seq)))
>              (,index (if ,is-list ,seq 0)))
> -       (while (if ,is-list
> -                  (consp ,index)
> -                (< ,index (seq-length ,seq)))
> -         (let ((,(car spec) (if ,is-list
> -                                (car ,index)
> -                              (seq-elt ,seq ,index))))
> -           ,@body
> -           (setq ,index (if ,is-list
> -                            (cdr ,index)
> -                          (+ ,index 1)))))
> -       ,@(if (cddr spec)
> -             `((setq ,(car spec) nil) ,@(cddr spec))))))
> +       (while (if ,length
> +                  (< ,index ,length)
> +                (consp ,index))
> +         (let ((,(car spec) (if ,length
> +                                (prog1 (seq-elt ,seq ,index)
> +                                  (setq ,index (+ ,index 1)))
> +                              (pop ,index))))
> +           ,@body))
> +       ;; FIXME: Do we really want to support this?
> +       ,@(cddr spec))))


Why wouldn't we want to support this?
It's not only useful, it is also consistent with `dolist'.

Nico
-- 
Nicolas Petton
http://nicolas-petton.fr

Attachment: signature.asc
Description: PGP signature


reply via email to

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