]> git.eshelyaron.com Git - emacs.git/commitdiff
Don’t attempt to modify constant conses
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 17 May 2020 00:04:15 +0000 (17:04 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 17 May 2020 00:05:37 +0000 (17:05 -0700)
From a patch privately suggested by Mattias Engdegård on 2020-05-11
in a followup to Bug#40671.
* admin/charsets/cp51932.awk:
* admin/charsets/eucjp-ms.awk:
Generate code that does not modify constant conses.
* doc/misc/emacs-mime.texi (Encoding Customization):
* lisp/emacs-lisp/byte-opt.el (byte-compile-side-effect-free-ops):
* lisp/frameset.el (frameset-persistent-filter-alist):
* lisp/gnus/gnus-sum.el (gnus-article-mode-line-format-alist):
Use append instead of nconc.
* lisp/language/japanese.el (japanese-ucs-cp932-to-jis-map)
(jisx0213-to-unicode):
Use mapcar instead of mapc.
* lisp/language/lao-util.el (lao-transcription-consonant-alist)
(lao-transcription-vowel-alist):
* lisp/language/tibetan.el (tibetan-subjoined-transcription-alist):
Use copy-sequence.
* test/src/fns-tests.el (fns-tests-nreverse):
(fns-tests-sort, fns-tests-collate-sort)
(fns-tests-string-version-lessp, fns-tests-mapcan):
Use copy-sequence, vector, and list.

admin/charsets/cp51932.awk
admin/charsets/eucjp-ms.awk
doc/misc/emacs-mime.texi
lisp/emacs-lisp/byte-opt.el
lisp/frameset.el
lisp/gnus/gnus-sum.el
lisp/language/japanese.el
lisp/language/lao-util.el
lisp/language/tibetan.el
test/src/fns-tests.el

index 6aac98815b5fd21354280602c160952109bff745..c355509524959ea555fedbc400ea904de0d7d80e 100644 (file)
@@ -43,13 +43,14 @@ BEGIN {
 
 END {
   print ")))";
-  print "  (mapc #'(lambda (x)";
-  print "          (setcar x (decode-char 'japanese-jisx0208 (car x))))";
-  print "      map)";
+  print "  (setq map (mapcar (lambda (x)";
+  print "                    (cons (decode-char 'japanese-jisx0208 (car x))";
+  print "                          (cdr x)))";
+  print "                  map))";
   print "  (define-translation-table 'cp51932-decode map)";
-  print "  (mapc #'(lambda (x)";
-  print "          (let ((tmp (car x)))";
-  print "            (setcar x (cdr x)) (setcdr x tmp)))";
+  print "  (mapc (lambda (x)";
+  print "        (let ((tmp (car x)))";
+  print "          (setcar x (cdr x)) (setcdr x tmp)))";
   print "      map)";
   print "  (define-translation-table 'cp51932-encode map))";
   print "";
index 0c9f94d0f48b43bbb16ffc388a11e4697b1c4fe2..f6a6748ce51519db1cc15a378d0da8e0b69ae1ae 100644 (file)
@@ -93,15 +93,17 @@ function write_entry (unicode) {
 
 END {
   print ")))";
-  print "  (mapc #'(lambda (x)";
+  print "  (setq map";
+  print "    (mapcar";
+  print "      (lambda (x)";
   print "          (let ((code (logand (car x) #x7F7F)))";
   print "            (if (integerp (cdr x))";
-  print "                (setcar x (decode-char 'japanese-jisx0208 code))";
-  print "              (setcar x (decode-char 'japanese-jisx0212 code))";
-  print "              (setcdr x (cadr x)))))";
-  print "      map)";
+  print "                (cons (decode-char 'japanese-jisx0208 code) (cdr x))";
+  print "              (cons (decode-char 'japanese-jisx0212 code)"
+  print "                    (cadr x)))))";
+  print "      map))";
   print "  (define-translation-table 'eucjp-ms-decode map)";
-  print "  (mapc #'(lambda (x)";
+  print "  (mapc (lambda (x)";
   print "          (let ((tmp (car x)))";
   print "            (setcar x (cdr x)) (setcdr x tmp)))";
   print "      map)";
index 42a7750b9acba2dcf19da5234f155b5fc09e27f5..2f38dcd495625473873dc8c048803a9f65719016 100644 (file)
@@ -917,7 +917,7 @@ Here's an example:
 @lisp
 (add-to-list 'gnus-newsgroup-variables 'mm-coding-system-priorities)
 (setq gnus-parameters
-      (nconc
+      (append
        ;; Some charsets are just examples!
        '(("^cn\\." ;; Chinese
           (mm-coding-system-priorities
index 4f72251aed524bdb62190950b6c740f6de0e3cbb..62b82e4f32a3f6a4fe32d6af2ce24f6bf4b367ae 100644 (file)
     byte-current-buffer byte-stack-ref))
 
 (defconst byte-compile-side-effect-free-ops
-  (nconc
+  (append
    '(byte-varref byte-nth byte-memq byte-car byte-cdr byte-length byte-aref
      byte-symbol-value byte-get byte-concat2 byte-concat3 byte-sub1 byte-add1
      byte-eqlsign byte-gtr byte-lss byte-leq byte-geq byte-diff byte-negate
index 10c6914f52d799c2bea1afb61f7e4071add8cccf..0462d776c0e8d08e65f7d560b3568850ea44f704 100644 (file)
@@ -396,17 +396,17 @@ Properties can be set with
 ;; or, if you're only changing a few items,
 ;;
 ;;   (defvar my-filter-alist
-;;     (nconc '((my-param1 . :never)
-;;              (my-param2 . my-filtering-function))
-;;            frameset-filter-alist)
+;;     (append '((my-param1 . :never)
+;;              (my-param2 . my-filtering-function))
+;;            frameset-filter-alist)
 ;;     "My brief customized parameter filter alist.")
 ;;
 ;; and pass it to the FILTER arg of the save/restore functions,
 ;; ALWAYS taking care of not modifying the original lists; if you're
 ;; going to do any modifying of my-filter-alist, please use
 ;;
-;;   (nconc '((my-param1 . :never) ...)
-;;          (copy-sequence frameset-filter-alist))
+;;   (append '((my-param1 . :never) ...)
+;;          (copy-sequence frameset-filter-alist))
 ;;
 ;; One thing you shouldn't forget is that they are alists, so searching
 ;; in them is sequential.  If you just want to change the default of
@@ -445,7 +445,7 @@ DO NOT MODIFY.  See `frameset-filter-alist' for a full description.")
 
 ;;;###autoload
 (defvar frameset-persistent-filter-alist
-  (nconc
+  (append
    '((background-color            . frameset-filter-sanitize-color)
      (buffer-list                 . :never)
      (buffer-predicate            . :never)
index 6f367692dddd6cd8be296e81346a5f4435e17eea..341f04ad772bf1a11876aad97b3354e960d69ea0 100644 (file)
@@ -1501,9 +1501,9 @@ the type of the variable (string, integer, character, etc).")
 
 ;; This is here rather than in gnus-art for compilation reasons.
 (defvar gnus-article-mode-line-format-alist
-  (nconc '((?w (gnus-article-wash-status) ?s)
-          (?m (gnus-article-mime-part-status) ?s))
-        gnus-summary-mode-line-format-alist))
+  (append '((?w (gnus-article-wash-status) ?s)
+           (?m (gnus-article-mime-part-status) ?s))
+         gnus-summary-mode-line-format-alist))
 
 (defvar gnus-last-search-regexp nil
   "Default regexp for article search command.")
index d77efa48c9bec3b7eb8906f888b8014f881061df..9a99245dfde0759f5fc0b2f917beba1436f12a36 100644 (file)
@@ -82,9 +82,7 @@
         (#x00A6 . #xFFE4)      ; BROKEN LINE           FULLWIDTH BROKEN LINE
         )))
   (define-translation-table 'japanese-ucs-jis-to-cp932-map map)
-  (mapc #'(lambda (x) (let ((tmp (car x)))
-                       (setcar x (cdr x)) (setcdr x tmp)))
-       map)
+  (setq map (mapcar (lambda (x) (cons (cdr x) (car x))) map))
   (define-translation-table 'japanese-ucs-cp932-to-jis-map map))
 
 ;; U+2014 (EM DASH) vs U+2015 (HORIZONTAL BAR)
@@ -241,8 +239,10 @@ eucJP-ms is defined in <http://www.opengroup.or.jp/jvc/cde/appendix.html>."
         (#x2b65 . [#x02E9 #x02E5])
         (#x2b66 . [#x02E5 #x02E9])))
       table)
-  (dolist (elt map)
-    (setcar elt (decode-char 'japanese-jisx0213-1 (car elt))))
+  (setq map
+        (mapcar (lambda (x) (cons (decode-char 'japanese-jisx0213-1 (car x))
+                                  (cdr x)))
+                map))
   (setq table (make-translation-table-from-alist map))
   (define-translation-table 'jisx0213-to-unicode table)
   (define-translation-table 'unicode-to-jisx0213
index a20aecee4218a3d3974fe11eca1d2a89b6782cc4..fa4c2f7f891bba9bf2d617b4c69cb134c999d980 100644 (file)
 ;; Semi-vowel-sign-lo and lower vowels are put under the letter.
 
 (defconst lao-transcription-consonant-alist
-  (sort '(;; single consonants
+  (sort
+   (copy-sequence
+       '(;; single consonants
          ("k" . "ກ")
          ("kh" . "ຂ")
          ("qh" . "ຄ")
          ("hy" . ["ຫຍ"])
          ("hn" . ["ຫນ"])
          ("hm" . ["ຫມ"])
-         )
-       (function (lambda (x y) (> (length (car x)) (length (car y)))))))
+         ))
+   (lambda (x y) (> (length (car x)) (length (car y))))))
 
 (defconst lao-transcription-semi-vowel-alist
   '(("r" . "ຼ")))
 
 (defconst lao-transcription-vowel-alist
-  (sort '(("a" . "ະ")
+  (sort
+   (copy-sequence
+       '(("a" . "ະ")
          ("ar" . "າ")
          ("i" . "ິ")
          ("ii" . "ີ")
          ("ai" . "ໄ")
          ("ei" . "ໃ")
          ("ao" . ["ເົາ"])
-         ("aM" . "ຳ"))
-       (function (lambda (x y) (> (length (car x)) (length (car y)))))))
+         ("aM" . "ຳ")))
+   (lambda (x y) (> (length (car x)) (length (car y))))))
 
 ;; Maa-sakod is put at the tail.
 (defconst lao-transcription-maa-sakod-alist
index d31cd5cd5286375504f86336770f16b58e9ea67a..bbd4729f6c58b2d22348c6348af4c63da62033b8 100644 (file)
 
 
 (defconst tibetan-subjoined-transcription-alist
-  (sort '(("+k"  . "ྐ")
+  (sort
+   (copy-sequence
+       '(("+k"  . "ྐ")
          ("+kh" . "ྑ")
          ("+g"  . "ྒ")
          ("+gh" . "ྒྷ")
          ("+W" . "ྺ") ;; fixed form subscribed WA
          ("+Y" . "ྻ") ;; fixed form subscribed YA
          ("+R" . "ྼ") ;; fixed form subscribed RA
-         )
-       (lambda (x y) (> (length (car x)) (length (car y))))))
+         ))
+   (lambda (x y) (> (length (car x)) (length (car y))))))
 
 ;;;
 ;;; alist for Tibetan base consonant <-> subjoined consonant conversion.
index c6ceae4a00e5e2088a0984f98047bc529775d730..b65543a64b50502ba8babe8112236876e2c8321a 100644 (file)
   (should-error (nreverse))
   (should-error (nreverse 1))
   (should-error (nreverse (make-char-table 'foo)))
-  (should (equal (nreverse "xyzzy") "yzzyx"))
-  (let ((A []))
+  (should (equal (nreverse (copy-sequence "xyzzy")) "yzzyx"))
+  (let ((A (vector)))
     (nreverse A)
     (should (equal A [])))
-  (let ((A [0]))
+  (let ((A (vector 0)))
     (nreverse A)
     (should (equal A [0])))
-  (let ((A [1 2 3 4]))
+  (let ((A (vector 1 2 3 4)))
     (nreverse A)
     (should (equal A [4 3 2 1])))
-  (let ((A [1 2 3 4]))
+  (let ((A (vector 1 2 3 4)))
     (nreverse A)
     (nreverse A)
     (should (equal A [1 2 3 4])))
-  (let* ((A [1 2 3 4])
+  (let* ((A (vector 1 2 3 4))
         (B (nreverse (nreverse A))))
     (should (equal A B))))
 
 ;; Invalid UTF-8 sequences shall be indicated.  How to create such strings?
 
 (ert-deftest fns-tests-sort ()
-  (should (equal (sort '(9 5 2 -1 5 3 8 7 4) (lambda (x y) (< x y)))
+  (should (equal (sort (list 9 5 2 -1 5 3 8 7 4) (lambda (x y) (< x y)))
                 '(-1 2 3 4 5 5 7 8 9)))
-  (should (equal (sort '(9 5 2 -1 5 3 8 7 4) (lambda (x y) (> x y)))
+  (should (equal (sort (list 9 5 2 -1 5 3 8 7 4) (lambda (x y) (> x y)))
                 '(9 8 7 5 5 4 3 2 -1)))
-  (should (equal (sort '[9 5 2 -1 5 3 8 7 4] (lambda (x y) (< x y)))
+  (should (equal (sort (vector 9 5 2 -1 5 3 8 7 4) (lambda (x y) (< x y)))
                 [-1 2 3 4 5 5 7 8 9]))
-  (should (equal (sort '[9 5 2 -1 5 3 8 7 4] (lambda (x y) (> x y)))
+  (should (equal (sort (vector 9 5 2 -1 5 3 8 7 4) (lambda (x y) (> x y)))
                 [9 8 7 5 5 4 3 2 -1]))
   (should (equal
           (sort
   ;; Punctuation and whitespace characters are relevant for POSIX.
   (should
    (equal
-    (sort '("11" "12" "1 1" "1 2" "1.1" "1.2")
+    (sort (list "11" "12" "1 1" "1 2" "1.1" "1.2")
          (lambda (a b) (string-collate-lessp a b "POSIX")))
     '("1 1" "1 2" "1.1" "1.2" "11" "12")))
   ;; Punctuation and whitespace characters are not taken into account
   (when (eq system-type 'windows-nt)
     (should
      (equal
-      (sort '("11" "12" "1 1" "1 2" "1.1" "1.2")
+      (sort (list "11" "12" "1 1" "1 2" "1.1" "1.2")
             (lambda (a b)
               (let ((w32-collate-ignore-punctuation t))
                 (string-collate-lessp
   ;; Diacritics are different letters for POSIX, they sort lexicographical.
   (should
    (equal
-    (sort '("Ævar" "Agustín" "Adrian" "Eli")
+    (sort (list "Ævar" "Agustín" "Adrian" "Eli")
          (lambda (a b) (string-collate-lessp a b "POSIX")))
     '("Adrian" "Agustín" "Eli" "Ævar")))
   ;; Diacritics are sorted between similar letters for other locales,
   (when (eq system-type 'windows-nt)
     (should
      (equal
-      (sort '("Ævar" "Agustín" "Adrian" "Eli")
+      (sort (list "Ævar" "Agustín" "Adrian" "Eli")
             (lambda (a b)
               (let ((w32-collate-ignore-punctuation t))
                 (string-collate-lessp
   (should (not (string-version-lessp "foo20000.png" "foo12.png")))
   (should (string-version-lessp "foo.png" "foo2.png"))
   (should (not (string-version-lessp "foo2.png" "foo.png")))
-  (should (equal (sort '("foo12.png" "foo2.png" "foo1.png")
+  (should (equal (sort (list "foo12.png" "foo2.png" "foo1.png")
                        'string-version-lessp)
                  '("foo1.png" "foo2.png" "foo12.png")))
   (should (string-version-lessp "foo2" "foo1234"))
   (should-error (mapcan))
   (should-error (mapcan #'identity))
   (should-error (mapcan #'identity (make-char-table 'foo)))
-  (should (equal (mapcan #'list '(1 2 3)) '(1 2 3)))
+  (should (equal (mapcan #'list (list 1 2 3)) '(1 2 3)))
   ;; `mapcan' is destructive
-  (let ((data '((foo) (bar))))
+  (let ((data (list (list 'foo) (list 'bar))))
     (should (equal (mapcan #'identity data) '(foo bar)))
     (should (equal data                     '((foo bar) (bar))))))