summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/generator.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2018-09-22 11:46:35 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2018-09-22 11:46:35 -0400
commit55ec674f5090f420c8982f5206e6566b5a664340 (patch)
treee38d5ca4c650db8ed0704ae9d20f3e935af89b05 /lisp/emacs-lisp/generator.el
parent3727bc7d599c24715a66de3e899a82b6f07d1aac (diff)
downloademacs-55ec674f5090f420c8982f5206e6566b5a664340.tar.gz
emacs-55ec674f5090f420c8982f5206e6566b5a664340.tar.bz2
emacs-55ec674f5090f420c8982f5206e6566b5a664340.zip
* lisp/multifile.el: New file, extracted from etags.el
The main motivation for this change was the introduction of project-query-replace. dired's multi-file query&replace was implemented on top of etags.el even though it did not use TAGS in any way, so I moved this generic multifile code into its own package, with a nicer interface, and then used that in project.el. * lisp/progmodes/project.el (project-files): New generic function. (project-search, project-query-replace): New commands. * lisp/dired-aux.el (dired-do-search, dired-do-query-replace-regexp): Use multifile.el instead of etags.el. * lisp/progmodes/etags.el: Remove redundant :groups. (next-file-list): Remove var. (tags-loop-revert-buffers): Make it an obsolete alias. (next-file): Don't autoload (it can't do anything useful before some other etags.el function setup the multifile operation). (tags--all-files): New function, extracted from next-file. (tags-next-file): Rename from next-file. Rewrite using tags--all-files and multifile-next-file. (next-file): Keep it as an obsolete alias. (tags-loop-operate, tags-loop-scan): Mark as obsolete. (tags--compat-files, tags--compat-initialize): New function. (tags-loop-continue): Rewrite using multifile-continue. Mark as obsolete. (tags--last-search-operate-function): New var. (tags-search, tags-query-replace): Rewrite using multifile.el. * lisp/emacs-lisp/generator.el (iter-end-of-sequence): Use 'define-error'. (iter-make): New macro. (iter-empty): New iterator. * lisp/menu-bar.el (menu-bar-search-menu, menu-bar-replace-menu): tags-loop-continue -> multifile-continue.
Diffstat (limited to 'lisp/emacs-lisp/generator.el')
-rw-r--r--lisp/emacs-lisp/generator.el15
1 files changed, 13 insertions, 2 deletions
diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el
index 506df59d8e2..e38c7d91096 100644
--- a/lisp/emacs-lisp/generator.el
+++ b/lisp/emacs-lisp/generator.el
@@ -567,8 +567,11 @@ modified copy."
(unless ,normal-exit-symbol
,@unwind-forms))))))
-(put 'iter-end-of-sequence 'error-conditions '(iter-end-of-sequence))
-(put 'iter-end-of-sequence 'error-message "iteration terminated")
+(define-error 'iter-end-of-sequence "Iteration terminated"
+ ;; FIXME: This was not defined originally as an `error' condition, so
+ ;; we reproduce this by passing itself as the parent, which avoids the
+ ;; default `error' parent. Maybe it *should* be in the `error' category?
+ 'iter-end-of-sequence)
(defun cps--make-close-iterator-form (terminal-state)
(if cps--cleanup-table-symbol
@@ -700,6 +703,14 @@ of values. Callers can retrieve each value using `iter-next'."
`(lambda ,arglist
,(cps-generate-evaluator body)))
+(defmacro iter-make (&rest body)
+ "Return a new iterator."
+ (declare (debug t))
+ (cps-generate-evaluator body))
+
+(defconst iter-empty (lambda (_op _val) (signal 'iter-end-of-sequence nil))
+ "Trivial iterator that always signals the end of sequence.")
+
(defun iter-next (iterator &optional yield-result)
"Extract a value from an iterator.
YIELD-RESULT becomes the return value of `iter-yield' in the