>From 330f6072c3dc614936199f1775679328c5452416 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 10 Mar 2018 18:20:45 -0500 Subject: [PATCH v1 1/2] Stop signaling an error when reading "smart quotes" in symbols Revert commits from 2018-01-28 "Fix round tripping of read->print for symbols with strange quotes", and 2017-07-22 "Signal error for symbol names with strange quotes (Bug#2967)". * etc/NEWS: Remove corresponding entries. * src/character.c (confusable_symbol_character_p): * test/src/lread-tests.el (lread-tests--old-style-backquotes): Remove. * src/lread.c (read1): Don't signal error on confusable character. * src/print.c (print_object): Don't escape confusable characters. --- etc/NEWS | 9 --------- src/character.c | 26 -------------------------- src/character.h | 2 -- src/lread.c | 7 ------- src/print.c | 3 +-- test/src/lread-tests.el | 17 ----------------- 6 files changed, 1 insertion(+), 63 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index daacf49e62..1ca4956c96 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1073,15 +1073,6 @@ and if the new behavior breaks your code please email 32252@debbugs.gnu.org. Because %o and %x can now format signed integers, they now support the + and space flags. -** To avoid confusion caused by "smart quotes", the reader signals an -error when reading Lisp symbols which begin with one of the following -quotation characters: ‘’‛“”‟〞"'. A symbol beginning with such a -character can be written by escaping the quotation character with a -backslash. For example: - - (read "‘smart") => (invalid-read-syntax "strange quote" "‘") - (read "\\‘smart") == (intern "‘smart") - +++ ** Omitting variables after '&optional' and '&rest' is now allowed. For example (defun foo (&optional)) is no longer an error. This is diff --git a/src/character.c b/src/character.c index 0b14e476c1..edaeca0a35 100644 --- a/src/character.c +++ b/src/character.c @@ -1056,32 +1056,6 @@ blankp (int c) return XFIXNUM (category) == UNICODE_CATEGORY_Zs; /* separator, space */ } - -/* Return true for characters that would read as symbol characters, - but graphically may be confused with some kind of punctuation. We - require an escaping backslash, when such characters begin a - symbol. */ -bool -confusable_symbol_character_p (int ch) -{ - switch (ch) - { - case 0x2018: /* LEFT SINGLE QUOTATION MARK */ - case 0x2019: /* RIGHT SINGLE QUOTATION MARK */ - case 0x201B: /* SINGLE HIGH-REVERSED-9 QUOTATION MARK */ - case 0x201C: /* LEFT DOUBLE QUOTATION MARK */ - case 0x201D: /* RIGHT DOUBLE QUOTATION MARK */ - case 0x201F: /* DOUBLE HIGH-REVERSED-9 QUOTATION MARK */ - case 0x301E: /* DOUBLE PRIME QUOTATION MARK */ - case 0xFF02: /* FULLWIDTH QUOTATION MARK */ - case 0xFF07: /* FULLWIDTH APOSTROPHE */ - return true; - - default: - return false; - } -} - signed char HEXDIGIT_CONST hexdigit[UCHAR_MAX + 1] = { #if HEXDIGIT_IS_CONST diff --git a/src/character.h b/src/character.h index 5dff85aed4..6d5349e07d 100644 --- a/src/character.h +++ b/src/character.h @@ -683,8 +683,6 @@ char_surrogate_p (int c) extern bool printablep (int); extern bool blankp (int); -extern bool confusable_symbol_character_p (int ch); - /* Return a translation table of id number ID. */ #define GET_TRANSLATION_TABLE(id) \ (XCDR (XVECTOR (Vtranslation_table_vector)->contents[(id)])) diff --git a/src/lread.c b/src/lread.c index 73e38d8995..fa3b38c312 100644 --- a/src/lread.c +++ b/src/lread.c @@ -3539,13 +3539,6 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list) if (! NILP (result)) return unbind_to (count, result); } - if (!quoted && multibyte) - { - int ch = STRING_CHAR ((unsigned char *) read_buffer); - if (confusable_symbol_character_p (ch)) - xsignal2 (Qinvalid_read_syntax, build_string ("strange quote"), - CALLN (Fstring, make_fixnum (ch))); - } { Lisp_Object result; ptrdiff_t nbytes = p - read_buffer; diff --git a/src/print.c b/src/print.c index c0c90bc7e9..c112d806cc 100644 --- a/src/print.c +++ b/src/print.c @@ -2049,8 +2049,7 @@ print_object (Lisp_Object obj, Lisp_Object printcharfun, bool escapeflag) || c == ';' || c == '#' || c == '(' || c == ')' || c == ',' || c == '.' || c == '`' || c == '[' || c == ']' || c == '?' || c <= 040 - || confusing - || (i == 1 && confusable_symbol_character_p (c))) + || confusing) { printchar ('\\', printcharfun); confusing = false; diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el index f19d98320a..0d7cd962bd 100644 --- a/test/src/lread-tests.el +++ b/test/src/lread-tests.el @@ -142,23 +142,6 @@ lread-tests--last-message "unescaped character literals " "`?\"', `?(', `?)', `?;', `?[', `?]' detected!"))))) -(ert-deftest lread-tests--funny-quote-symbols () - "Check that 'smart quotes' or similar trigger errors in symbol names." - (dolist (quote-char - '(#x2018 ;; LEFT SINGLE QUOTATION MARK - #x2019 ;; RIGHT SINGLE QUOTATION MARK - #x201B ;; SINGLE HIGH-REVERSED-9 QUOTATION MARK - #x201C ;; LEFT DOUBLE QUOTATION MARK - #x201D ;; RIGHT DOUBLE QUOTATION MARK - #x201F ;; DOUBLE HIGH-REVERSED-9 QUOTATION MARK - #x301E ;; DOUBLE PRIME QUOTATION MARK - #xFF02 ;; FULLWIDTH QUOTATION MARK - #xFF07 ;; FULLWIDTH APOSTROPHE - )) - (let ((str (format "%cfoo" quote-char))) - (should-error (read str) :type 'invalid-read-syntax) - (should (eq (read (concat "\\" str)) (intern str)))))) - (ert-deftest lread-test-bug26837 () "Test for https://debbugs.gnu.org/26837 ." (let ((load-path (cons -- 2.11.0