]> git.eshelyaron.com Git - emacs.git/commitdiff
Embed JSON readtable into json-read
authorMark Oteiza <mvoteiza@udel.edu>
Mon, 4 Sep 2017 07:40:30 +0000 (03:40 -0400)
committerMark Oteiza <mvoteiza@udel.edu>
Mon, 4 Sep 2017 07:40:30 +0000 (03:40 -0400)
Also unroll dispatch into a cond.
* lisp/json.el (json-readtable): Remove.
(json-readtable-dispatch): New macro.  Assimilate json-readtable.
(json-read): Use the macro.

lisp/json.el

index 64486258ccf58b4469f0928afd82fc69382dcbd3..025a77d4b08fa3e92048c22b8bb1a6bd56bdf38a 100644 (file)
@@ -669,19 +669,22 @@ become JSON objects."
 
 ;;; JSON reader.
 
-(defvar json-readtable
+(defmacro json-readtable-dispatch (char)
+  "Dispatch reader function for CHAR."
+  (declare (debug (symbolp)))
   (let ((table
          '((?t json-read-keyword "true")
            (?f json-read-keyword "false")
            (?n json-read-keyword "null")
            (?{ json-read-object)
            (?\[ json-read-array)
-           (?\" json-read-string))))
-    (mapc (lambda (char)
-            (push (list char 'json-read-number) table))
-          '(?- ?+ ?. ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
-    table)
-  "Readtable for JSON reader.")
+           (?\" json-read-string)))
+        res)
+    (dolist (c '(?- ?+ ?. ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
+      (push (list c 'json-read-number) table))
+    (pcase-dolist (`(,c . ,rest) table)
+      (push `((eq ,char ,c) (,@rest)) res))
+    `(cond ,@res (t (signal 'json-readtable-error ,char)))))
 
 (defun json-read ()
   "Parse and return the JSON object following point.
@@ -690,10 +693,7 @@ Advances point just past JSON object."
   (let ((char (json-peek)))
     (if (zerop char)
         (signal 'json-end-of-file nil)
-      (let ((record (cdr (assq char json-readtable))))
-        (if (functionp (car record))
-            (apply (car record) (cdr record))
-          (signal 'json-readtable-error record))))))
+      (json-readtable-dispatch char))))
 
 ;; Syntactic sugar for the reader