aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog3
-rw-r--r--lisp/emacs-lisp/cl-macs.el219
2 files changed, 112 insertions, 110 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 7c329430495..b07b612ffb1 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,8 @@
12010-11-05 Glenn Morris <rgm@gnu.org> 12010-11-05 Glenn Morris <rgm@gnu.org>
2 2
3 * emacs-lisp/cl-macs.el (loop): Give local variable args a prefix.
4 (cl-parse-loop-clause, cl-loop-handle-accum): Update for above change.
5
3 * emacs-lisp/byte-opt.el (byte-decompile-bytecode-1): Give local 6 * emacs-lisp/byte-opt.el (byte-decompile-bytecode-1): Give local
4 variables bytes, ptr, op a prefix. 7 variables bytes, ptr, op a prefix.
5 (disassemble-offset): Update for above change. 8 (disassemble-offset): Update for above change.
diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
index f6d66c64c7a..0cd518bbe62 100644
--- a/lisp/emacs-lisp/cl-macs.el
+++ b/lisp/emacs-lisp/cl-macs.el
@@ -639,7 +639,7 @@ This is compatible with Common Lisp, but note that `defun' and
639 639
640;;; The "loop" macro. 640;;; The "loop" macro.
641 641
642(defvar args) (defvar loop-accum-var) (defvar loop-accum-vars) 642(defvar loop-args) (defvar loop-accum-var) (defvar loop-accum-vars)
643(defvar loop-bindings) (defvar loop-body) (defvar loop-destr-temps) 643(defvar loop-bindings) (defvar loop-body) (defvar loop-destr-temps)
644(defvar loop-finally) (defvar loop-finish-flag) (defvar loop-first-flag) 644(defvar loop-finally) (defvar loop-finish-flag) (defvar loop-first-flag)
645(defvar loop-initially) (defvar loop-map-form) (defvar loop-name) 645(defvar loop-initially) (defvar loop-map-form) (defvar loop-name)
@@ -647,7 +647,7 @@ This is compatible with Common Lisp, but note that `defun' and
647(defvar loop-result-var) (defvar loop-steps) (defvar loop-symbol-macs) 647(defvar loop-result-var) (defvar loop-steps) (defvar loop-symbol-macs)
648 648
649;;;###autoload 649;;;###autoload
650(defmacro loop (&rest args) 650(defmacro loop (&rest loop-args)
651 "The Common Lisp `loop' macro. 651 "The Common Lisp `loop' macro.
652Valid clauses are: 652Valid clauses are:
653 for VAR from/upfrom/downfrom NUM to/upto/downto/above/below NUM by NUM, 653 for VAR from/upfrom/downfrom NUM to/upto/downto/above/below NUM by NUM,
@@ -662,8 +662,8 @@ Valid clauses are:
662 finally return EXPR, named NAME. 662 finally return EXPR, named NAME.
663 663
664\(fn CLAUSE...)" 664\(fn CLAUSE...)"
665 (if (not (memq t (mapcar 'symbolp (delq nil (delq t (copy-list args)))))) 665 (if (not (memq t (mapcar 'symbolp (delq nil (delq t (copy-list loop-args))))))
666 (list 'block nil (list* 'while t args)) 666 (list 'block nil (list* 'while t loop-args))
667 (let ((loop-name nil) (loop-bindings nil) 667 (let ((loop-name nil) (loop-bindings nil)
668 (loop-body nil) (loop-steps nil) 668 (loop-body nil) (loop-steps nil)
669 (loop-result nil) (loop-result-explicit nil) 669 (loop-result nil) (loop-result-explicit nil)
@@ -672,8 +672,8 @@ Valid clauses are:
672 (loop-initially nil) (loop-finally nil) 672 (loop-initially nil) (loop-finally nil)
673 (loop-map-form nil) (loop-first-flag nil) 673 (loop-map-form nil) (loop-first-flag nil)
674 (loop-destr-temps nil) (loop-symbol-macs nil)) 674 (loop-destr-temps nil) (loop-symbol-macs nil))
675 (setq args (append args '(cl-end-loop))) 675 (setq loop-args (append loop-args '(cl-end-loop)))
676 (while (not (eq (car args) 'cl-end-loop)) (cl-parse-loop-clause)) 676 (while (not (eq (car loop-args) 'cl-end-loop)) (cl-parse-loop-clause))
677 (if loop-finish-flag 677 (if loop-finish-flag
678 (push `((,loop-finish-flag t)) loop-bindings)) 678 (push `((,loop-finish-flag t)) loop-bindings))
679 (if loop-first-flag 679 (if loop-first-flag
@@ -713,34 +713,34 @@ Valid clauses are:
713 (setq body (list (list* 'symbol-macrolet loop-symbol-macs body)))) 713 (setq body (list (list* 'symbol-macrolet loop-symbol-macs body))))
714 (list* 'block loop-name body))))) 714 (list* 'block loop-name body)))))
715 715
716(defun cl-parse-loop-clause () ; uses args, loop-* 716(defun cl-parse-loop-clause () ; uses loop-*
717 (let ((word (pop args)) 717 (let ((word (pop loop-args))
718 (hash-types '(hash-key hash-keys hash-value hash-values)) 718 (hash-types '(hash-key hash-keys hash-value hash-values))
719 (key-types '(key-code key-codes key-seq key-seqs 719 (key-types '(key-code key-codes key-seq key-seqs
720 key-binding key-bindings))) 720 key-binding key-bindings)))
721 (cond 721 (cond
722 722
723 ((null args) 723 ((null loop-args)
724 (error "Malformed `loop' macro")) 724 (error "Malformed `loop' macro"))
725 725
726 ((eq word 'named) 726 ((eq word 'named)
727 (setq loop-name (pop args))) 727 (setq loop-name (pop loop-args)))
728 728
729 ((eq word 'initially) 729 ((eq word 'initially)
730 (if (memq (car args) '(do doing)) (pop args)) 730 (if (memq (car loop-args) '(do doing)) (pop loop-args))
731 (or (consp (car args)) (error "Syntax error on `initially' clause")) 731 (or (consp (car loop-args)) (error "Syntax error on `initially' clause"))
732 (while (consp (car args)) 732 (while (consp (car loop-args))
733 (push (pop args) loop-initially))) 733 (push (pop loop-args) loop-initially)))
734 734
735 ((eq word 'finally) 735 ((eq word 'finally)
736 (if (eq (car args) 'return) 736 (if (eq (car loop-args) 'return)
737 (setq loop-result-explicit (or (cl-pop2 args) '(quote nil))) 737 (setq loop-result-explicit (or (cl-pop2 loop-args) '(quote nil)))
738 (if (memq (car args) '(do doing)) (pop args)) 738 (if (memq (car loop-args) '(do doing)) (pop loop-args))
739 (or (consp (car args)) (error "Syntax error on `finally' clause")) 739 (or (consp (car loop-args)) (error "Syntax error on `finally' clause"))
740 (if (and (eq (caar args) 'return) (null loop-name)) 740 (if (and (eq (caar loop-args) 'return) (null loop-name))
741 (setq loop-result-explicit (or (nth 1 (pop args)) '(quote nil))) 741 (setq loop-result-explicit (or (nth 1 (pop loop-args)) '(quote nil)))
742 (while (consp (car args)) 742 (while (consp (car loop-args))
743 (push (pop args) loop-finally))))) 743 (push (pop loop-args) loop-finally)))))
744 744
745 ((memq word '(for as)) 745 ((memq word '(for as))
746 (let ((loop-for-bindings nil) (loop-for-sets nil) (loop-for-steps nil) 746 (let ((loop-for-bindings nil) (loop-for-sets nil) (loop-for-steps nil)
@@ -749,29 +749,29 @@ Valid clauses are:
749 ;; Use `gensym' rather than `make-symbol'. It's important that 749 ;; Use `gensym' rather than `make-symbol'. It's important that
750 ;; (not (eq (symbol-name var1) (symbol-name var2))) because 750 ;; (not (eq (symbol-name var1) (symbol-name var2))) because
751 ;; these vars get added to the cl-macro-environment. 751 ;; these vars get added to the cl-macro-environment.
752 (let ((var (or (pop args) (gensym "--cl-var--")))) 752 (let ((var (or (pop loop-args) (gensym "--cl-var--"))))
753 (setq word (pop args)) 753 (setq word (pop loop-args))
754 (if (eq word 'being) (setq word (pop args))) 754 (if (eq word 'being) (setq word (pop loop-args)))
755 (if (memq word '(the each)) (setq word (pop args))) 755 (if (memq word '(the each)) (setq word (pop loop-args)))
756 (if (memq word '(buffer buffers)) 756 (if (memq word '(buffer buffers))
757 (setq word 'in args (cons '(buffer-list) args))) 757 (setq word 'in loop-args (cons '(buffer-list) loop-args)))
758 (cond 758 (cond
759 759
760 ((memq word '(from downfrom upfrom to downto upto 760 ((memq word '(from downfrom upfrom to downto upto
761 above below by)) 761 above below by))
762 (push word args) 762 (push word loop-args)
763 (if (memq (car args) '(downto above)) 763 (if (memq (car loop-args) '(downto above))
764 (error "Must specify `from' value for downward loop")) 764 (error "Must specify `from' value for downward loop"))
765 (let* ((down (or (eq (car args) 'downfrom) 765 (let* ((down (or (eq (car loop-args) 'downfrom)
766 (memq (caddr args) '(downto above)))) 766 (memq (caddr loop-args) '(downto above))))
767 (excl (or (memq (car args) '(above below)) 767 (excl (or (memq (car loop-args) '(above below))
768 (memq (caddr args) '(above below)))) 768 (memq (caddr loop-args) '(above below))))
769 (start (and (memq (car args) '(from upfrom downfrom)) 769 (start (and (memq (car loop-args) '(from upfrom downfrom))
770 (cl-pop2 args))) 770 (cl-pop2 loop-args)))
771 (end (and (memq (car args) 771 (end (and (memq (car loop-args)
772 '(to upto downto above below)) 772 '(to upto downto above below))
773 (cl-pop2 args))) 773 (cl-pop2 loop-args)))
774 (step (and (eq (car args) 'by) (cl-pop2 args))) 774 (step (and (eq (car loop-args) 'by) (cl-pop2 loop-args)))
775 (end-var (and (not (cl-const-expr-p end)) 775 (end-var (and (not (cl-const-expr-p end))
776 (make-symbol "--cl-var--"))) 776 (make-symbol "--cl-var--")))
777 (step-var (and (not (cl-const-expr-p step)) 777 (step-var (and (not (cl-const-expr-p step))
@@ -794,7 +794,7 @@ Valid clauses are:
794 (let* ((on (eq word 'on)) 794 (let* ((on (eq word 'on))
795 (temp (if (and on (symbolp var)) 795 (temp (if (and on (symbolp var))
796 var (make-symbol "--cl-var--")))) 796 var (make-symbol "--cl-var--"))))
797 (push (list temp (pop args)) loop-for-bindings) 797 (push (list temp (pop loop-args)) loop-for-bindings)
798 (push (list 'consp temp) loop-body) 798 (push (list 'consp temp) loop-body)
799 (if (eq word 'in-ref) 799 (if (eq word 'in-ref)
800 (push (list var (list 'car temp)) loop-symbol-macs) 800 (push (list var (list 'car temp)) loop-symbol-macs)
@@ -804,8 +804,8 @@ Valid clauses are:
804 (push (list var (if on temp (list 'car temp))) 804 (push (list var (if on temp (list 'car temp)))
805 loop-for-sets)))) 805 loop-for-sets))))
806 (push (list temp 806 (push (list temp
807 (if (eq (car args) 'by) 807 (if (eq (car loop-args) 'by)
808 (let ((step (cl-pop2 args))) 808 (let ((step (cl-pop2 loop-args)))
809 (if (and (memq (car-safe step) 809 (if (and (memq (car-safe step)
810 '(quote function 810 '(quote function
811 function*)) 811 function*))
@@ -816,10 +816,10 @@ Valid clauses are:
816 loop-for-steps))) 816 loop-for-steps)))
817 817
818 ((eq word '=) 818 ((eq word '=)
819 (let* ((start (pop args)) 819 (let* ((start (pop loop-args))
820 (then (if (eq (car args) 'then) (cl-pop2 args) start))) 820 (then (if (eq (car loop-args) 'then) (cl-pop2 loop-args) start)))
821 (push (list var nil) loop-for-bindings) 821 (push (list var nil) loop-for-bindings)
822 (if (or ands (eq (car args) 'and)) 822 (if (or ands (eq (car loop-args) 'and))
823 (progn 823 (progn
824 (push `(,var 824 (push `(,var
825 (if ,(or loop-first-flag 825 (if ,(or loop-first-flag
@@ -839,7 +839,7 @@ Valid clauses are:
839 ((memq word '(across across-ref)) 839 ((memq word '(across across-ref))
840 (let ((temp-vec (make-symbol "--cl-vec--")) 840 (let ((temp-vec (make-symbol "--cl-vec--"))
841 (temp-idx (make-symbol "--cl-idx--"))) 841 (temp-idx (make-symbol "--cl-idx--")))
842 (push (list temp-vec (pop args)) loop-for-bindings) 842 (push (list temp-vec (pop loop-args)) loop-for-bindings)
843 (push (list temp-idx -1) loop-for-bindings) 843 (push (list temp-idx -1) loop-for-bindings)
844 (push (list '< (list 'setq temp-idx (list '1+ temp-idx)) 844 (push (list '< (list 'setq temp-idx (list '1+ temp-idx))
845 (list 'length temp-vec)) loop-body) 845 (list 'length temp-vec)) loop-body)
@@ -851,15 +851,15 @@ Valid clauses are:
851 loop-for-sets)))) 851 loop-for-sets))))
852 852
853 ((memq word '(element elements)) 853 ((memq word '(element elements))
854 (let ((ref (or (memq (car args) '(in-ref of-ref)) 854 (let ((ref (or (memq (car loop-args) '(in-ref of-ref))
855 (and (not (memq (car args) '(in of))) 855 (and (not (memq (car loop-args) '(in of)))
856 (error "Expected `of'")))) 856 (error "Expected `of'"))))
857 (seq (cl-pop2 args)) 857 (seq (cl-pop2 loop-args))
858 (temp-seq (make-symbol "--cl-seq--")) 858 (temp-seq (make-symbol "--cl-seq--"))
859 (temp-idx (if (eq (car args) 'using) 859 (temp-idx (if (eq (car loop-args) 'using)
860 (if (and (= (length (cadr args)) 2) 860 (if (and (= (length (cadr loop-args)) 2)
861 (eq (caadr args) 'index)) 861 (eq (caadr loop-args) 'index))
862 (cadr (cl-pop2 args)) 862 (cadr (cl-pop2 loop-args))
863 (error "Bad `using' clause")) 863 (error "Bad `using' clause"))
864 (make-symbol "--cl-idx--")))) 864 (make-symbol "--cl-idx--"))))
865 (push (list temp-seq seq) loop-for-bindings) 865 (push (list temp-seq seq) loop-for-bindings)
@@ -885,13 +885,13 @@ Valid clauses are:
885 loop-for-steps))) 885 loop-for-steps)))
886 886
887 ((memq word hash-types) 887 ((memq word hash-types)
888 (or (memq (car args) '(in of)) (error "Expected `of'")) 888 (or (memq (car loop-args) '(in of)) (error "Expected `of'"))
889 (let* ((table (cl-pop2 args)) 889 (let* ((table (cl-pop2 loop-args))
890 (other (if (eq (car args) 'using) 890 (other (if (eq (car loop-args) 'using)
891 (if (and (= (length (cadr args)) 2) 891 (if (and (= (length (cadr loop-args)) 2)
892 (memq (caadr args) hash-types) 892 (memq (caadr loop-args) hash-types)
893 (not (eq (caadr args) word))) 893 (not (eq (caadr loop-args) word)))
894 (cadr (cl-pop2 args)) 894 (cadr (cl-pop2 loop-args))
895 (error "Bad `using' clause")) 895 (error "Bad `using' clause"))
896 (make-symbol "--cl-var--")))) 896 (make-symbol "--cl-var--"))))
897 (if (memq word '(hash-value hash-values)) 897 (if (memq word '(hash-value hash-values))
@@ -901,16 +901,16 @@ Valid clauses are:
901 901
902 ((memq word '(symbol present-symbol external-symbol 902 ((memq word '(symbol present-symbol external-symbol
903 symbols present-symbols external-symbols)) 903 symbols present-symbols external-symbols))
904 (let ((ob (and (memq (car args) '(in of)) (cl-pop2 args)))) 904 (let ((ob (and (memq (car loop-args) '(in of)) (cl-pop2 loop-args))))
905 (setq loop-map-form 905 (setq loop-map-form
906 `(mapatoms (lambda (,var) . --cl-map) ,ob)))) 906 `(mapatoms (lambda (,var) . --cl-map) ,ob))))
907 907
908 ((memq word '(overlay overlays extent extents)) 908 ((memq word '(overlay overlays extent extents))
909 (let ((buf nil) (from nil) (to nil)) 909 (let ((buf nil) (from nil) (to nil))
910 (while (memq (car args) '(in of from to)) 910 (while (memq (car loop-args) '(in of from to))
911 (cond ((eq (car args) 'from) (setq from (cl-pop2 args))) 911 (cond ((eq (car loop-args) 'from) (setq from (cl-pop2 loop-args)))
912 ((eq (car args) 'to) (setq to (cl-pop2 args))) 912 ((eq (car loop-args) 'to) (setq to (cl-pop2 loop-args)))
913 (t (setq buf (cl-pop2 args))))) 913 (t (setq buf (cl-pop2 loop-args)))))
914 (setq loop-map-form 914 (setq loop-map-form
915 `(cl-map-extents 915 `(cl-map-extents
916 (lambda (,var ,(make-symbol "--cl-var--")) 916 (lambda (,var ,(make-symbol "--cl-var--"))
@@ -921,12 +921,12 @@ Valid clauses are:
921 (let ((buf nil) (prop nil) (from nil) (to nil) 921 (let ((buf nil) (prop nil) (from nil) (to nil)
922 (var1 (make-symbol "--cl-var1--")) 922 (var1 (make-symbol "--cl-var1--"))
923 (var2 (make-symbol "--cl-var2--"))) 923 (var2 (make-symbol "--cl-var2--")))
924 (while (memq (car args) '(in of property from to)) 924 (while (memq (car loop-args) '(in of property from to))
925 (cond ((eq (car args) 'from) (setq from (cl-pop2 args))) 925 (cond ((eq (car loop-args) 'from) (setq from (cl-pop2 loop-args)))
926 ((eq (car args) 'to) (setq to (cl-pop2 args))) 926 ((eq (car loop-args) 'to) (setq to (cl-pop2 loop-args)))
927 ((eq (car args) 'property) 927 ((eq (car loop-args) 'property)
928 (setq prop (cl-pop2 args))) 928 (setq prop (cl-pop2 loop-args)))
929 (t (setq buf (cl-pop2 args))))) 929 (t (setq buf (cl-pop2 loop-args)))))
930 (if (and (consp var) (symbolp (car var)) (symbolp (cdr var))) 930 (if (and (consp var) (symbolp (car var)) (symbolp (cdr var)))
931 (setq var1 (car var) var2 (cdr var)) 931 (setq var1 (car var) var2 (cdr var))
932 (push (list var (list 'cons var1 var2)) loop-for-sets)) 932 (push (list var (list 'cons var1 var2)) loop-for-sets))
@@ -936,13 +936,13 @@ Valid clauses are:
936 ,buf ,prop ,from ,to)))) 936 ,buf ,prop ,from ,to))))
937 937
938 ((memq word key-types) 938 ((memq word key-types)
939 (or (memq (car args) '(in of)) (error "Expected `of'")) 939 (or (memq (car loop-args) '(in of)) (error "Expected `of'"))
940 (let ((map (cl-pop2 args)) 940 (let ((map (cl-pop2 loop-args))
941 (other (if (eq (car args) 'using) 941 (other (if (eq (car loop-args) 'using)
942 (if (and (= (length (cadr args)) 2) 942 (if (and (= (length (cadr loop-args)) 2)
943 (memq (caadr args) key-types) 943 (memq (caadr loop-args) key-types)
944 (not (eq (caadr args) word))) 944 (not (eq (caadr loop-args) word)))
945 (cadr (cl-pop2 args)) 945 (cadr (cl-pop2 loop-args))
946 (error "Bad `using' clause")) 946 (error "Bad `using' clause"))
947 (make-symbol "--cl-var--")))) 947 (make-symbol "--cl-var--"))))
948 (if (memq word '(key-binding key-bindings)) 948 (if (memq word '(key-binding key-bindings))
@@ -964,7 +964,7 @@ Valid clauses are:
964 loop-for-steps))) 964 loop-for-steps)))
965 965
966 ((memq word '(window windows)) 966 ((memq word '(window windows))
967 (let ((scr (and (memq (car args) '(in of)) (cl-pop2 args))) 967 (let ((scr (and (memq (car loop-args) '(in of)) (cl-pop2 loop-args)))
968 (temp (make-symbol "--cl-var--"))) 968 (temp (make-symbol "--cl-var--")))
969 (push (list var (if scr 969 (push (list var (if scr
970 (list 'frame-selected-window scr) 970 (list 'frame-selected-window scr)
@@ -982,9 +982,9 @@ Valid clauses are:
982 (if handler 982 (if handler
983 (funcall handler var) 983 (funcall handler var)
984 (error "Expected a `for' preposition, found %s" word))))) 984 (error "Expected a `for' preposition, found %s" word)))))
985 (eq (car args) 'and)) 985 (eq (car loop-args) 'and))
986 (setq ands t) 986 (setq ands t)
987 (pop args)) 987 (pop loop-args))
988 (if (and ands loop-for-bindings) 988 (if (and ands loop-for-bindings)
989 (push (nreverse loop-for-bindings) loop-bindings) 989 (push (nreverse loop-for-bindings) loop-bindings)
990 (setq loop-bindings (nconc (mapcar 'list loop-for-bindings) 990 (setq loop-bindings (nconc (mapcar 'list loop-for-bindings)
@@ -1000,11 +1000,11 @@ Valid clauses are:
1000 1000
1001 ((eq word 'repeat) 1001 ((eq word 'repeat)
1002 (let ((temp (make-symbol "--cl-var--"))) 1002 (let ((temp (make-symbol "--cl-var--")))
1003 (push (list (list temp (pop args))) loop-bindings) 1003 (push (list (list temp (pop loop-args))) loop-bindings)
1004 (push (list '>= (list 'setq temp (list '1- temp)) 0) loop-body))) 1004 (push (list '>= (list 'setq temp (list '1- temp)) 0) loop-body)))
1005 1005
1006 ((memq word '(collect collecting)) 1006 ((memq word '(collect collecting))
1007 (let ((what (pop args)) 1007 (let ((what (pop loop-args))
1008 (var (cl-loop-handle-accum nil 'nreverse))) 1008 (var (cl-loop-handle-accum nil 'nreverse)))
1009 (if (eq var loop-accum-var) 1009 (if (eq var loop-accum-var)
1010 (push (list 'progn (list 'push what var) t) loop-body) 1010 (push (list 'progn (list 'push what var) t) loop-body)
@@ -1013,7 +1013,7 @@ Valid clauses are:
1013 t) loop-body)))) 1013 t) loop-body))))
1014 1014
1015 ((memq word '(nconc nconcing append appending)) 1015 ((memq word '(nconc nconcing append appending))
1016 (let ((what (pop args)) 1016 (let ((what (pop loop-args))
1017 (var (cl-loop-handle-accum nil 'nreverse))) 1017 (var (cl-loop-handle-accum nil 'nreverse)))
1018 (push (list 'progn 1018 (push (list 'progn
1019 (list 'setq var 1019 (list 'setq var
@@ -1028,27 +1028,27 @@ Valid clauses are:
1028 var what))) t) loop-body))) 1028 var what))) t) loop-body)))
1029 1029
1030 ((memq word '(concat concating)) 1030 ((memq word '(concat concating))
1031 (let ((what (pop args)) 1031 (let ((what (pop loop-args))
1032 (var (cl-loop-handle-accum ""))) 1032 (var (cl-loop-handle-accum "")))
1033 (push (list 'progn (list 'callf 'concat var what) t) loop-body))) 1033 (push (list 'progn (list 'callf 'concat var what) t) loop-body)))
1034 1034
1035 ((memq word '(vconcat vconcating)) 1035 ((memq word '(vconcat vconcating))
1036 (let ((what (pop args)) 1036 (let ((what (pop loop-args))
1037 (var (cl-loop-handle-accum []))) 1037 (var (cl-loop-handle-accum [])))
1038 (push (list 'progn (list 'callf 'vconcat var what) t) loop-body))) 1038 (push (list 'progn (list 'callf 'vconcat var what) t) loop-body)))
1039 1039
1040 ((memq word '(sum summing)) 1040 ((memq word '(sum summing))
1041 (let ((what (pop args)) 1041 (let ((what (pop loop-args))
1042 (var (cl-loop-handle-accum 0))) 1042 (var (cl-loop-handle-accum 0)))
1043 (push (list 'progn (list 'incf var what) t) loop-body))) 1043 (push (list 'progn (list 'incf var what) t) loop-body)))
1044 1044
1045 ((memq word '(count counting)) 1045 ((memq word '(count counting))
1046 (let ((what (pop args)) 1046 (let ((what (pop loop-args))
1047 (var (cl-loop-handle-accum 0))) 1047 (var (cl-loop-handle-accum 0)))
1048 (push (list 'progn (list 'if what (list 'incf var)) t) loop-body))) 1048 (push (list 'progn (list 'if what (list 'incf var)) t) loop-body)))
1049 1049
1050 ((memq word '(minimize minimizing maximize maximizing)) 1050 ((memq word '(minimize minimizing maximize maximizing))
1051 (let* ((what (pop args)) 1051 (let* ((what (pop loop-args))
1052 (temp (if (cl-simple-expr-p what) what (make-symbol "--cl-var--"))) 1052 (temp (if (cl-simple-expr-p what) what (make-symbol "--cl-var--")))
1053 (var (cl-loop-handle-accum nil)) 1053 (var (cl-loop-handle-accum nil))
1054 (func (intern (substring (symbol-name word) 0 3))) 1054 (func (intern (substring (symbol-name word) 0 3)))
@@ -1059,27 +1059,27 @@ Valid clauses are:
1059 1059
1060 ((eq word 'with) 1060 ((eq word 'with)
1061 (let ((bindings nil)) 1061 (let ((bindings nil))
1062 (while (progn (push (list (pop args) 1062 (while (progn (push (list (pop loop-args)
1063 (and (eq (car args) '=) (cl-pop2 args))) 1063 (and (eq (car loop-args) '=) (cl-pop2 loop-args)))
1064 bindings) 1064 bindings)
1065 (eq (car args) 'and)) 1065 (eq (car loop-args) 'and))
1066 (pop args)) 1066 (pop loop-args))
1067 (push (nreverse bindings) loop-bindings))) 1067 (push (nreverse bindings) loop-bindings)))
1068 1068
1069 ((eq word 'while) 1069 ((eq word 'while)
1070 (push (pop args) loop-body)) 1070 (push (pop loop-args) loop-body))
1071 1071
1072 ((eq word 'until) 1072 ((eq word 'until)
1073 (push (list 'not (pop args)) loop-body)) 1073 (push (list 'not (pop loop-args)) loop-body))
1074 1074
1075 ((eq word 'always) 1075 ((eq word 'always)
1076 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-flag--"))) 1076 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-flag--")))
1077 (push (list 'setq loop-finish-flag (pop args)) loop-body) 1077 (push (list 'setq loop-finish-flag (pop loop-args)) loop-body)
1078 (setq loop-result t)) 1078 (setq loop-result t))
1079 1079
1080 ((eq word 'never) 1080 ((eq word 'never)
1081 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-flag--"))) 1081 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-flag--")))
1082 (push (list 'setq loop-finish-flag (list 'not (pop args))) 1082 (push (list 'setq loop-finish-flag (list 'not (pop loop-args)))
1083 loop-body) 1083 loop-body)
1084 (setq loop-result t)) 1084 (setq loop-result t))
1085 1085
@@ -1087,20 +1087,20 @@ Valid clauses are:
1087 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-flag--"))) 1087 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-flag--")))
1088 (or loop-result-var (setq loop-result-var (make-symbol "--cl-var--"))) 1088 (or loop-result-var (setq loop-result-var (make-symbol "--cl-var--")))
1089 (push (list 'setq loop-finish-flag 1089 (push (list 'setq loop-finish-flag
1090 (list 'not (list 'setq loop-result-var (pop args)))) 1090 (list 'not (list 'setq loop-result-var (pop loop-args))))
1091 loop-body)) 1091 loop-body))
1092 1092
1093 ((memq word '(if when unless)) 1093 ((memq word '(if when unless))
1094 (let* ((cond (pop args)) 1094 (let* ((cond (pop loop-args))
1095 (then (let ((loop-body nil)) 1095 (then (let ((loop-body nil))
1096 (cl-parse-loop-clause) 1096 (cl-parse-loop-clause)
1097 (cl-loop-build-ands (nreverse loop-body)))) 1097 (cl-loop-build-ands (nreverse loop-body))))
1098 (else (let ((loop-body nil)) 1098 (else (let ((loop-body nil))
1099 (if (eq (car args) 'else) 1099 (if (eq (car loop-args) 'else)
1100 (progn (pop args) (cl-parse-loop-clause))) 1100 (progn (pop loop-args) (cl-parse-loop-clause)))
1101 (cl-loop-build-ands (nreverse loop-body)))) 1101 (cl-loop-build-ands (nreverse loop-body))))
1102 (simple (and (eq (car then) t) (eq (car else) t)))) 1102 (simple (and (eq (car then) t) (eq (car else) t))))
1103 (if (eq (car args) 'end) (pop args)) 1103 (if (eq (car loop-args) 'end) (pop loop-args))
1104 (if (eq word 'unless) (setq then (prog1 else (setq else then)))) 1104 (if (eq word 'unless) (setq then (prog1 else (setq else then))))
1105 (let ((form (cons (if simple (cons 'progn (nth 1 then)) (nth 2 then)) 1105 (let ((form (cons (if simple (cons 'progn (nth 1 then)) (nth 2 then))
1106 (if simple (nth 1 else) (list (nth 2 else)))))) 1106 (if simple (nth 1 else) (list (nth 2 else))))))
@@ -1114,22 +1114,22 @@ Valid clauses are:
1114 1114
1115 ((memq word '(do doing)) 1115 ((memq word '(do doing))
1116 (let ((body nil)) 1116 (let ((body nil))
1117 (or (consp (car args)) (error "Syntax error on `do' clause")) 1117 (or (consp (car loop-args)) (error "Syntax error on `do' clause"))
1118 (while (consp (car args)) (push (pop args) body)) 1118 (while (consp (car loop-args)) (push (pop loop-args) body))
1119 (push (cons 'progn (nreverse (cons t body))) loop-body))) 1119 (push (cons 'progn (nreverse (cons t body))) loop-body)))
1120 1120
1121 ((eq word 'return) 1121 ((eq word 'return)
1122 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-var--"))) 1122 (or loop-finish-flag (setq loop-finish-flag (make-symbol "--cl-var--")))
1123 (or loop-result-var (setq loop-result-var (make-symbol "--cl-var--"))) 1123 (or loop-result-var (setq loop-result-var (make-symbol "--cl-var--")))
1124 (push (list 'setq loop-result-var (pop args) 1124 (push (list 'setq loop-result-var (pop loop-args)
1125 loop-finish-flag nil) loop-body)) 1125 loop-finish-flag nil) loop-body))
1126 1126
1127 (t 1127 (t
1128 (let ((handler (and (symbolp word) (get word 'cl-loop-handler)))) 1128 (let ((handler (and (symbolp word) (get word 'cl-loop-handler))))
1129 (or handler (error "Expected a loop keyword, found %s" word)) 1129 (or handler (error "Expected a loop keyword, found %s" word))
1130 (funcall handler)))) 1130 (funcall handler))))
1131 (if (eq (car args) 'and) 1131 (if (eq (car loop-args) 'and)
1132 (progn (pop args) (cl-parse-loop-clause))))) 1132 (progn (pop loop-args) (cl-parse-loop-clause)))))
1133 1133
1134(defun cl-loop-let (specs body par) ; uses loop-* 1134(defun cl-loop-let (specs body par) ; uses loop-*
1135 (let ((p specs) (temps nil) (new nil)) 1135 (let ((p specs) (temps nil) (new nil))
@@ -1165,9 +1165,9 @@ Valid clauses are:
1165 (list* (if par 'let 'let*) 1165 (list* (if par 'let 'let*)
1166 (nconc (nreverse temps) (nreverse new)) body)))) 1166 (nconc (nreverse temps) (nreverse new)) body))))
1167 1167
1168(defun cl-loop-handle-accum (def &optional func) ; uses args, loop-* 1168(defun cl-loop-handle-accum (def &optional func) ; uses loop-*
1169 (if (eq (car args) 'into) 1169 (if (eq (car loop-args) 'into)
1170 (let ((var (cl-pop2 args))) 1170 (let ((var (cl-pop2 loop-args)))
1171 (or (memq var loop-accum-vars) 1171 (or (memq var loop-accum-vars)
1172 (progn (push (list (list var def)) loop-bindings) 1172 (progn (push (list (list var def)) loop-bindings)
1173 (push var loop-accum-vars))) 1173 (push var loop-accum-vars)))
@@ -2791,5 +2791,4 @@ surrounded by (block NAME ...).
2791;; generated-autoload-file: "cl-loaddefs.el" 2791;; generated-autoload-file: "cl-loaddefs.el"
2792;; End: 2792;; End:
2793 2793
2794;; arch-tag: afd947a6-b553-4df1-bba5-000be6388f46
2795;;; cl-macs.el ends here 2794;;; cl-macs.el ends here