branch: elpa/parseclj
commit a08b85ffa8ab54dd92c5af9cf820ee36855e7f0c
Author: Arne Brasseur <[email protected]>
Commit: Arne Brasseur <[email protected]>
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)))