Support for parsing literal symbols, chars, booleans, regexes and nil
This commit is contained in:
parent
a83216f37c
commit
1b944180de
1 changed files with 8 additions and 6 deletions
|
@ -109,7 +109,7 @@
|
||||||
|
|
||||||
(defn parse* [reader]
|
(defn parse* [reader]
|
||||||
(take-while
|
(take-while
|
||||||
:form
|
#(not= :_eof (:form %))
|
||||||
(flatten
|
(flatten
|
||||||
(repeatedly
|
(repeatedly
|
||||||
(fn []
|
(fn []
|
||||||
|
@ -118,7 +118,7 @@
|
||||||
(let [start (.getLineNumber reader)
|
(let [start (.getLineNumber reader)
|
||||||
form (binding [*comments* sub-level-comments]
|
form (binding [*comments* sub-level-comments]
|
||||||
(try (. clojure.lang.LispReader
|
(try (. clojure.lang.LispReader
|
||||||
(read reader false nil false))
|
(read reader false :_eof false))
|
||||||
(catch Exception ex
|
(catch Exception ex
|
||||||
(let [msg (str "Problem parsing near line " start
|
(let [msg (str "Problem parsing near line " start
|
||||||
" <" (.readLine reader) ">"
|
" <" (.readLine reader) ">"
|
||||||
|
@ -247,12 +247,14 @@
|
||||||
[form raw nspace-sym]
|
[form raw nspace-sym]
|
||||||
[nil raw])
|
[nil raw])
|
||||||
|
|
||||||
|
(defn- literal-form? [form]
|
||||||
|
(or (string? form) (number? form) (keyword? form) (symbol? form)
|
||||||
|
(char? form) (true? form) (false? form) (instance? java.util.regex.Pattern form)))
|
||||||
|
|
||||||
(defmethod dispatch-form :default
|
(defmethod dispatch-form :default
|
||||||
[form raw nspace-sym]
|
[form raw nspace-sym]
|
||||||
;; Strings which are inlined into clojure files outside of forms are parsed
|
(cond (literal-form? form)
|
||||||
;; as `String` instances, while numbers - as `Number` subclasses.
|
(dispatch-literal form raw nspace-sym)
|
||||||
(cond (or (string? form) (number? form) (keyword? form))
|
|
||||||
(dispatch-literal form raw nspace-sym)
|
|
||||||
(and (first form)
|
(and (first form)
|
||||||
(.isInstance clojure.lang.Named (first form))
|
(.isInstance clojure.lang.Named (first form))
|
||||||
(re-find #"^def" (-> form first name)))
|
(re-find #"^def" (-> form first name)))
|
||||||
|
|
Loading…
Reference in a new issue