]> git.eshelyaron.com Git - emacs.git/commitdiff
Add mechanism for escaping shorthand substitution feature/shorthand-namespacing
authorJoão Távora <joaotavora@gmail.com>
Wed, 22 Sep 2021 22:53:15 +0000 (23:53 +0100)
committerJoão Távora <joaotavora@gmail.com>
Wed, 22 Sep 2021 22:53:15 +0000 (23:53 +0100)
* src/lread.c (read1): Add skip_shorthand variable.  Add a '#\'
case.  Sometimes call oblookup instead of
oblookup_considering_shorthand.

src/lread.c

index c68c04e572a089c18da401f77f69ea8ddd2fd210..509e834f693d0c79ad544f17781d40f970f8be72 100644 (file)
@@ -2972,6 +2972,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
 {
   int c;
   bool uninterned_symbol = false;
+  bool skip_shorthand = false;
   bool multibyte;
   char stackbuf[stackbufsize];
   current_thread->stack_top = stackbuf;
@@ -3367,6 +3368,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
       if (c == ':')
        {
          uninterned_symbol = true;
+       read_hash_prefixed_symbol:
          c = READCHAR;
          if (!(c > 040
                && c != NO_BREAK_SPACE
@@ -3380,6 +3382,12 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
            }
          goto read_symbol;
        }
+      /* #/foo is the shorthand-oblivious symbol named foo.  */
+      if (c == '\\')
+       {
+         skip_shorthand = true;
+         goto read_hash_prefixed_symbol;
+       }
       /* ## is the empty symbol.  */
       if (c == '#')
        return Fintern (empty_unibyte_string, Qnil);
@@ -3760,7 +3768,7 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
        ptrdiff_t nbytes = p - read_buffer;
        UNREAD (c);
 
-       if (!quoted && !uninterned_symbol)
+       if (!quoted && !uninterned_symbol && !skip_shorthand)
          {
            ptrdiff_t len;
            Lisp_Object result = string_to_number (read_buffer, 10, &len);
@@ -3795,10 +3803,14 @@ read1 (Lisp_Object readcharfun, int *pch, bool first_in_list)
              ptrdiff_t longhand_chars = 0;
              ptrdiff_t longhand_bytes = 0;
 
-             Lisp_Object tem
-               = oblookup_considering_shorthand
+             Lisp_Object tem;
+             if (skip_shorthand)
+               tem = oblookup (obarray, read_buffer, nchars, nbytes);
+             else {
+               tem = oblookup_considering_shorthand
                (obarray, read_buffer, nchars, nbytes,
                 &longhand, &longhand_chars, &longhand_bytes);
+             }
 
              if (SYMBOLP (tem))
                result = tem;