Support for parsing literal symbols, chars, booleans, regexes and nil

This commit is contained in:
Tero Parviainen 2012-04-12 17:20:56 +03:00
parent a83216f37c
commit 1b944180de

View file

@ -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,11 +247,13 @@
[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.
(cond (or (string? form) (number? form) (keyword? form))
(dispatch-literal form raw nspace-sym) (dispatch-literal form raw nspace-sym)
(and (first form) (and (first form)
(.isInstance clojure.lang.Named (first form)) (.isInstance clojure.lang.Named (first form))