     (.contains s ".") (match-float s (doto (.matcher float-pattern s) .matches))
     :else (match-int s (doto (.matcher int-pattern s) .matches))))
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; unicode
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defn- parse-symbol [^String token]
+  (when (not (= "" token))
+    (let [ns-idx (.indexOf token "/")
+          ns (if-not (== -1 ns-idx) (.substring token 0 ns-idx))]
+      (if (nil? ns)
+        [nil token]
+        (when-not (== (inc ns-idx) (count token))
+          (let [sym (.substring token (inc ns-idx))]
+            (when (and (not (numeric? (.charAt sym 0)))
+                       (not (= "" sym))
+                       (or (= sym "/")
+                           (== -1 (.indexOf sym "/"))))
+              [ns sym])))))))
+
+(defn read-dispatch
+  [rdr _]
+  (if-let [ch (read-char rdr)]
+    (if-let [dm (dispatch-macros ch)]
+      (dm rdr ch)
+      (if-let [obj (read-tagged (doto rdr (unread ch)) ch)] ;; ctor reader is implemented as a taggged literal
+        obj
+        (reader-error rdr "No dispatch macro for " ch)))
+    (reader-error rdr "EOF while reading character")))
+
+(defn read-unmatched-delimiter
+  [rdr ch]
+  (reader-error rdr "Unmatched delimiter " ch))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; readers
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(def read-comment skip-line)
 
 (defn read-unicode-char
   ([^String token offset length base]

          :else (reader-error rdr "Unsupported character: \\" token)))
      (reader-error rdr "EOF while reading character"))))

(defn ^PersistentVector read-delimited-list
  [delim rdr recursive?]
  (let [first-line  (when (instance? IndexingPushbackReader rdr)
                      (get-line-number rdr))
        delim ^char delim]
    (loop [a (transient [])]

        (and (or (identical? \+ c) (identical?  \- c))
             (numeric? (peek-char reader))))))

(defn newline? [c]
  "Checks whether the character is a newline"
  (let [c (char c)]
    (or (identical? \newline c)
        (nil? c))))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; read helpers
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(declare read macros dispatch-macros)

(defn reader-error
  "Throws an Exception info, if rdr is an IndexingReader, additional information about column and line number is provided"
  [rdr & msg]
  (throw (ex-info (apply str msg)
                  (merge {:type :reader-exception}
                         (if (instance? blind.reader.IndexingReader rdr)
                           {:line (get-line-number rdr)
                            :column (get-column-number rdr)})))))

