获取在clojure中的repl会话中定义的所有用户创建函数的转储

时间:2016-01-15 18:59:55

标签: clojure

有没有办法将我输入的所有源代码转储到repl会话中。我已经使用(defn ...)创建了一堆函数,但是在没有首先在文本文件(IDE)中输入它的情况下“实时”完成了它。

是否有方便的方法让源代码退出repl会话?

我注意到:

(dir user)

会给我一个类型的打印列表:

user.proxy $ java.lang.Object中

所以我似乎无法将打印列表放入Seq中以映射像'source'这样的函数。即使我可以:

(source my-defined-fn)

返回“找不到来源”...即使我亲自将其输入到repl会话中。

任何方式这样做?感谢。

1 个答案:

答案 0 :(得分:0)

抱歉,但我怀疑答案是否定的: - /

您获得的最佳效果是在repl缓冲区中向上滚动到您定义它的位置。源函数通过查看var的元数据来查找函数代码所在的文件和行号(或上次评估它),打开文件和打印行。它看起来像这样:

...
(when-let [filepath (:file (meta v))]
  (when-let [strm (.getResourceAsStream (RT/baseLoader) filepath)]
    (with-open [rdr (LineNumberReader. (InputStreamReader. strm))]
      (dotimes [_ (dec (:line (meta v)))] (.readLine rdr))
...

不包括元数据中的完整源代码是为了在正常情况下保存内存,但这确实使它在这里不太方便。