]> git.eshelyaron.com Git - emacs.git/commitdiff
Add #_ reader macro to escape shorthand renaming
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>
Mon, 27 Sep 2021 00:07:11 +0000 (01:07 +0100)
* src/lread.c (read1): Add skip_shorthand variable.  Add a '#_'
case.  If skip_shorthand call oblookup instead of
oblookup_considering_shorthand.

* test/lisp/progmodes/elisp-mode-tests.el
(elisp-shorthand-escape): New test.

* test/lisp/progmodes/elisp-resources/simple-shorthand-test.el
(#_f-test4---): New fixture function.

src/lread.c
test/lisp/progmodes/elisp-mode-tests.el
test/lisp/progmodes/elisp-resources/simple-shorthand-test.el

index 51a7084821e8875afd87b5ac8fbde2f48b2594ec..db8c847a8754b4c677f471ebf3c49b555059e5e6 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 really the symbol foo, regardless of shorthands  */
+      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;
index 9fe583d8cc32f9abe6af79af9d07dea9425e25f7..fbf264a715fb4600232272ecf7c0da4661079dd2 100644 (file)
@@ -1096,5 +1096,15 @@ evaluation of BODY."
                        "elisp--foo-test-complete-me"))
       (revert-buffer t t))))
 
+(ert-deftest elisp-shorthand-escape ()
+  (let ((test-file (expand-file-name "simple-shorthand-test.el"
+                                     elisp--test-resources-dir)))
+    (load test-file)
+    (should (intern-soft "f-test4---"))
+    (should-not (intern-soft "elisp--foo-test4---"))
+    (should (= 84 (funcall (intern-soft "f-test4---"))))
+    (should (unintern "f-test4---"))))
+
+
 (provide 'elisp-mode-tests)
 ;;; elisp-mode-tests.el ends here
index cadcb4de89d4fb8d6934994d5ed931c2f7894a64..ec568093af224880445f99b45c823c86faf856e2 100644 (file)
 
 (defvar f-test-complete-me 42)
 
+(defun #_f-test4--- () 84)
+
 (when nil
   (f-test3)
   (f-test2)
-  (f-test))
+  (f-test)
+  (#_f-test4---))
 
 
 ;; Local Variables: