Form at line n

overly simple form parser

(defn form-reader [charsource]
      (loop [[c & r] (seq charsource) open-parens-count 0 out []]
            (cond 
              (= \( c)
                (recur r (inc open-parens-count) (conj out c))
              (= \) c)
                (recur r (dec open-parens-count) (conj out c))
              (and (not= 0 (count out)) (= open-parens-count 0))
                (apply str out)
              :else
                (recur r open-parens-count (conj out c)))))
 
 
(defn form-at-n [n file]
      (let [pho (fn pho [file action]
                    (try
                      (let [chunk (action file)]
                        (if chunk
                          (lazy-cons chunk (pho file action))
                          (do (.close file) nil)))
                      (catch java.io.IOException e nil)))
            rducer (fn [x y]
                       (if (not (string? x))
                         (if (= n (.getLineNumber x))
                           (let [s (form-reader (pho x #(char (.read %))))]
                             (.close x)
                             s)
                           x)
                         x))]
        (reduce rducer
                (let [f (-> file
                            java.io.File.
                            java.io.FileReader.
                            java.io.LineNumberReader.)]
                  (cons f (pho f #(.readLine %)))))))
user=> (println (form-at-n 138 "code/math.clj"))
(defn d "divisor function, totally useless" [n]
      (* 2 (apply + (map #(if (math/whole-number? (/ n %)) 1 0)
                                          (range 1 (inc (floor (sqrt n))))))))
nil
user=>