emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/parseclj a08b85ffa8 032/185: Implement parsing maps


From: ELPA Syncer
Subject: [nongnu] elpa/parseclj a08b85ffa8 032/185: Implement parsing maps
Date: Tue, 28 Dec 2021 14:05:11 -0500 (EST)

branch: elpa/parseclj
commit a08b85ffa8ab54dd92c5af9cf820ee36855e7f0c
Author: Arne Brasseur <arne@arnebrasseur.net>
Commit: Arne Brasseur <arne@arnebrasseur.net>

    Implement parsing maps
    
    Parse to alist because hash maps don't have value semantics.
---
 clj-lex-test.el   | 11 ++++++++++-
 clj-lex.el        |  8 ++++++++
 clj-parse-test.el |  8 +++++++-
 clj-parse.el      |  8 ++++++--
 4 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/clj-lex-test.el b/clj-lex-test.el
index 8da315ca50..3710ad2945 100644
--- a/clj-lex-test.el
+++ b/clj-lex-test.el
@@ -116,7 +116,16 @@
     (goto-char 1)
     (should (equal (clj-lex-next) (clj-lex-token :lbracket "[" 1)))
     (should (equal (clj-lex-next) (clj-lex-token :number "123" 2)))
-    (should (equal (clj-lex-next) (clj-lex-token :rbracket "]" 5)))))
+    (should (equal (clj-lex-next) (clj-lex-token :rbracket "]" 5))))
+
+  (with-temp-buffer
+    (insert "{:count 123}")
+    (goto-char 1)
+    (should (equal (clj-lex-next) (clj-lex-token :lbrace "{" 1)))
+    (should (equal (clj-lex-next) (clj-lex-token :keyword ":count" 2)))
+    (should (equal (clj-lex-next) (clj-lex-token :whitespace " " 8)))
+    (should (equal (clj-lex-next) (clj-lex-token :number "123" 9)))
+    (should (equal (clj-lex-next) (clj-lex-token :rbrace "}" 12)))))
 
 (ert-deftest clj-lex-test-at-number? ()
   (dolist (str '("123" ".9" "+1" "0" "-456"))
diff --git a/clj-lex.el b/clj-lex.el
index 377e8c766b..94e5c5823d 100644
--- a/clj-lex.el
+++ b/clj-lex.el
@@ -185,6 +185,14 @@
         (right-char)
         (clj-lex-token :rbracket "]" pos))
 
+       ((equal char ?{)
+        (right-char)
+        (clj-lex-token :lbrace "{" pos))
+
+       ((equal char ?})
+        (right-char)
+        (clj-lex-token :rbrace "}" pos))
+
        ((clj-lex-at-number?)
         (clj-lex-number))
 
diff --git a/clj-parse-test.el b/clj-parse-test.el
index 8f2869cd06..0554f5d1a5 100644
--- a/clj-parse-test.el
+++ b/clj-parse-test.el
@@ -84,7 +84,13 @@
   (with-temp-buffer
     (insert "[123]")
     (goto-char 1)
-    (should (equal (clj-parse) '([123])))))
+    (should (equal (clj-parse) '([123]))))
+
+  (with-temp-buffer
+    (insert "{:count 123}")
+    (goto-char 1)
+    (should (equal (clj-parse) '(((:count . 123)))))))
+
 
 (provide 'clj-parse-test)
 
diff --git a/clj-parse.el b/clj-parse.el
index 7a12152357..3c90cd302d 100644
--- a/clj-parse.el
+++ b/clj-parse.el
@@ -98,7 +98,10 @@
      (:whitespace :ws)
      (:number coll)
      (:list (-butlast (cdr coll)))
-     (:vector (apply #'vector (-butlast (cdr coll)))))
+     (:vector (apply #'vector (-butlast (cdr coll))))
+     (:map (mapcar (lambda (pair)
+                     (cons (car pair) (cadr pair)))
+                   (-partition 2 (-butlast (cdr coll))))))
    stack))
 
 ;; TODO move this to clj-lex
@@ -134,7 +137,8 @@
 
       (cl-case (clj-parse--token-type (car stack))
         (:rparen (setf stack (clj-parse--reduce-coll stack :lparen :list 
reduceN)))
-        (:rbracket (setf stack (clj-parse--reduce-coll stack :lbracket :vector 
reduceN))))
+        (:rbracket (setf stack (clj-parse--reduce-coll stack :lbracket :vector 
reduceN)))
+        (:rbrace (setf stack (clj-parse--reduce-coll stack :lbrace :map 
reduceN))))
 
 
       (setq token (clj-lex-next)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]