 	  input-string)))))
 
 
-;;
-
-(def special-forms
-  (sort (map name '[def if do let quote var fn loop recur throw try monitor-enter monitor-exit . new set!])))
-
-(defn special-form? [n-str] (some #(= % n-str) special-forms))
-
-(defn ns-special-forms [& no-op]
-  '{"def" def "if" if "do" do "let" let "quote" quote "var" var "fn" fn "loop" loop "recur" recur "throw" throw "try" try "monitor-enter" monitor-enter "monitor-exit" monitor-exit "." . "new" new "set!" set!})
+;; functions to collect different (filtered/sub-) lists of vars, classes, special-forms, etc.
+
+(defn ns-special-forms 
+  "Collects the special form string-symbol map from both the special-symbol list and the special-form vars in clojure.core.
+  Returns a map that has same format as ns-map, ns-publics and friends."
+  [& no-op]
+  (let [str-list (concat special-forms (map name (filter special-form? (keys (ns-map *ns*)))))
+        sym-list (map symbol str-list)]
+    (zipmap str-list sym-list)))
+
 
 (defn symbols-of-ns-coll [ns-action f ns-coll display-fqn? search-doc-strings?]
   (when-not (or (nil? ns-coll) (empty? ns-coll) (nil? (first ns-coll)))

;; var?

;; (in-ns 'clj-ns-browser.utils)


;; "clojure.core//" appears to be a special case not handled well by
;; the function symbol.
(defn better-symbol [fqn]
  (if (= fqn "clojure.core//")
    (symbol "clojure.core" "/")
    (symbol fqn)))


(defn eval-sym [sym]

        (str "Sorry, not a fully qualified clojure name: " fqn)))))


(def ^:dynamic *max-value-display-size* 2500)

;; TBD: Problems with these, probably because of problems with
;; cd-client.core behavior:
