diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-10-30 04:01:31 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2011-10-30 04:01:31 -0400 |
commit | c1e2f5fa6977e86cf2797c4f4627e518b40c5182 (patch) | |
tree | f0e373f5a3a0a2c856c10018105a3b86fe37f97e | |
parent | 1bc4c3aeb94bac3ff93a1e1a57d93d0d65824f59 (diff) | |
download | emacs-c1e2f5fa6977e86cf2797c4f4627e518b40c5182.tar.gz emacs-c1e2f5fa6977e86cf2797c4f4627e518b40c5182.tar.bz2 emacs-c1e2f5fa6977e86cf2797c4f4627e518b40c5182.zip |
* lisp/eshell/esh-cmd.el (eshell-rewrite-for-command): Fix last change.
(eshell-do-eval): Handle multiple expressions in `while' body.
Fixes: debbugs:9907
-rw-r--r-- | lisp/ChangeLog | 1 | ||||
-rw-r--r-- | lisp/eshell/esh-cmd.el | 39 |
2 files changed, 25 insertions, 15 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 65378251efa..7047bd47c7b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -12,6 +12,7 @@ Use backquotes and prefer setq to set. (eshell-lookup-function, function-p-func, eshell-functionp): Remove. (eshell-macrop): Use functionp. + (eshell-do-eval): Handle multiple expressions in `while' body. 2011-10-30 Chong Yidong <cyd@gnu.org> diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el index cac33f130f1..52c8c2ddc20 100644 --- a/lisp/eshell/esh-cmd.el +++ b/lisp/eshell/esh-cmd.el @@ -480,19 +480,25 @@ implemented via rewriting, rather than as a function." (let ((body (car (last terms)))) (setcdr (last terms 2) nil) `(let ((for-items - (append - ,@(mapcar - (lambda (elem) - (if (listp elem) - elem - `(list ,elem))) - (cdr (cddr terms))))) + ;; Apparently, eshell-do-eval only works for immutable + ;; let-bindings, i.e. we cannot use `setq' on `for-items'. + ;; Instead we store the list in the car of a cons-cell (which + ;; acts as a ref-cell) so we can setcar instead of setq. + (list + (append + ,@(mapcar + (lambda (elem) + (if (listp elem) + elem + `(list ,elem))) + (cdr (cddr terms)))))) (eshell-command-body '(nil)) (eshell-test-body '(nil))) - (while (consp for-items) - (let ((,(intern (cadr terms)) (car for-items))) - (eshell-protect ,(eshell-invokify-arg body t))) - (setq for-items (cdr for-items))) + (while (consp (car for-items)) + (let ((,(intern (cadr terms)) (caar for-items))) + (eshell-protect + ,(eshell-invokify-arg body t))) + (setcar for-items (cdar for-items))) (eshell-close-handles eshell-last-command-status (list 'quote eshell-last-command-result)))))) @@ -805,9 +811,9 @@ This is used on systems where `start-process' is not supported." (when (memq (car head) eshell-deferrable-commands) (ignore (setcar head - (intern-soft - (concat (symbol-name (car head)) "*")))))) - ;; The last process in the pipe should get its handles + (intern-soft + (concat (symbol-name (car head)) "*")))))) + ;; The last process in the pipe should get its handles ;; redirected as we found them before running the pipe. ,(if (null (cdr pipeline)) `(progn @@ -1031,7 +1037,10 @@ be finished later after the completion of an asynchronous subprocess." (unless (car eshell-test-body) (setcar eshell-test-body (eshell-copy-tree (car args)))) (while (cadr (eshell-do-eval (car eshell-test-body))) - (setcar eshell-command-body (eshell-copy-tree (cadr args))) + (setcar eshell-command-body + (if (cddr args) + `(progn ,@(eshell-copy-tree (cdr args))) + (eshell-copy-tree (cadr args)))) (eshell-do-eval (car eshell-command-body) synchronous-p) (setcar eshell-command-body nil) (setcar eshell-test-body (eshell-copy-tree (car args)))) |