diff options
| author | Stefan Monnier | 2015-04-24 16:11:35 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2015-04-24 16:11:35 -0400 |
| commit | e224c9465dfe7033b11c0aeb830298c101c9bdcc (patch) | |
| tree | 72847f19bb9220eedc8d729c3c813c4bea36c13b | |
| parent | 18a78f8215cc0052bf41d23b8d594cde50d776dd (diff) | |
| download | emacs-e224c9465dfe7033b11c0aeb830298c101c9bdcc.tar.gz emacs-e224c9465dfe7033b11c0aeb830298c101c9bdcc.zip | |
* 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.
| -rw-r--r-- | doc/lispref/sequences.texi | 2 | ||||
| -rw-r--r-- | 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 e1330f7d594..b48fae4741f 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: | |||
| 790 | @end example | 790 | @end example |
| 791 | @end defun | 791 | @end defun |
| 792 | 792 | ||
| 793 | @defmac seq-doseq (var sequence [result]) body@dots{} | 793 | @defmac seq-doseq (var sequence) body@dots{} |
| 794 | @cindex sequence iteration | 794 | @cindex sequence iteration |
| 795 | This macro is like @code{dolist}, except that @var{sequence} can be a list, | 795 | This macro is like @code{dolist}, except that @var{sequence} can be a list, |
| 796 | vector or string (@pxref{Iteration} for more information about the | 796 | 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 320ee201487..b8647ec93ec 100644 --- a/lisp/emacs-lisp/seq.el +++ b/lisp/emacs-lisp/seq.el | |||
| @@ -44,31 +44,28 @@ | |||
| 44 | 44 | ||
| 45 | (defmacro seq-doseq (spec &rest body) | 45 | (defmacro seq-doseq (spec &rest body) |
| 46 | "Loop over a sequence. | 46 | "Loop over a sequence. |
| 47 | Similar to `dolist' but can be applied lists, strings and vectors. | 47 | Similar to `dolist' but can be applied to lists, strings, and vectors. |
| 48 | 48 | ||
| 49 | Evaluate BODY with VAR bound to each element of SEQ, in turn. | 49 | Evaluate BODY with VAR bound to each element of SEQ, in turn. |
| 50 | Then evaluate RESULT to get return value, default nil. | ||
| 51 | 50 | ||
| 52 | \(fn (VAR SEQ [RESULT]) BODY...)" | 51 | \(fn (VAR SEQ) BODY...)" |
| 53 | (declare (indent 1) (debug ((symbolp form &optional form) body))) | 52 | (declare (indent 1) (debug ((symbolp form &optional form) body))) |
| 54 | (let ((is-list (make-symbol "is-list")) | 53 | (let ((is-list (make-symbol "is-list")) |
| 55 | (seq (make-symbol "seq")) | 54 | (seq (make-symbol "seq")) |
| 56 | (index (make-symbol "index"))) | 55 | (index (make-symbol "index"))) |
| 57 | `(let* ((,seq ,(cadr spec)) | 56 | `(let* ((,seq ,(cadr spec)) |
| 58 | (,is-list (listp ,seq)) | 57 | (,length (if (listp ,seq) nil (seq-length ,seq))) |
| 59 | (,index (if ,is-list ,seq 0))) | 58 | (,index (if ,is-list ,seq 0))) |
| 60 | (while (if ,is-list | 59 | (while (if ,length |
| 61 | (consp ,index) | 60 | (< ,index ,length) |
| 62 | (< ,index (seq-length ,seq))) | 61 | (consp ,index)) |
| 63 | (let ((,(car spec) (if ,is-list | 62 | (let ((,(car spec) (if ,length |
| 64 | (car ,index) | 63 | (prog1 (seq-elt ,seq ,index) |
| 65 | (seq-elt ,seq ,index)))) | 64 | (setq ,index (+ ,index 1))) |
| 66 | ,@body | 65 | (pop ,index)))) |
| 67 | (setq ,index (if ,is-list | 66 | ,@body)) |
| 68 | (cdr ,index) | 67 | ;; FIXME: Do we really want to support this? |
| 69 | (+ ,index 1))))) | 68 | ,@(cddr spec)))) |
| 70 | ,@(if (cddr spec) | ||
| 71 | `((setq ,(car spec) nil) ,@(cddr spec)))))) | ||
| 72 | 69 | ||
| 73 | (defun seq-drop (seq n) | 70 | (defun seq-drop (seq n) |
| 74 | "Return a subsequence of SEQ without its first N elements. | 71 | "Return a subsequence of SEQ without its first N elements. |
| @@ -350,7 +347,10 @@ This is an optimization for lists in `seq-take-while'." | |||
| 350 | (defalias 'seq-each #'seq-do) | 347 | (defalias 'seq-each #'seq-do) |
| 351 | (defalias 'seq-map #'mapcar) | 348 | (defalias 'seq-map #'mapcar) |
| 352 | 349 | ||
| 353 | (add-to-list 'emacs-lisp-mode-hook #'seq--activate-font-lock-keywords) | 350 | (unless (fboundp 'elisp--font-lock-flush-elisp-buffers) |
| 351 | ;; In Emacs≥25, (via elisp--font-lock-flush-elisp-buffers and a few others) | ||
| 352 | ;; we automatically highlight macros. | ||
| 353 | (add-to-list 'emacs-lisp-mode-hook #'seq--activate-font-lock-keywords)) | ||
| 354 | 354 | ||
| 355 | (provide 'seq) | 355 | (provide 'seq) |
| 356 | ;;; seq.el ends here | 356 | ;;; seq.el ends here |