【问题标题】:Getting a dump of all the user-created functions defined in a repl session in clojure获取 clojure 中 repl 会话中定义的所有用户创建函数的转储
【发布时间】:2016-01-15 18:59:54
【问题描述】:

有没有办法获得我在 repl 会话中输入的所有源代码的转储。我使用 (defn ...) 创建了一堆函数,但没有先将它们输入文本文件 (IDE),而是“即时”完成的。

有没有一种方便的方法可以让源代码退出 repl 会话?

我注意到:

(dir user)

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

user.proxy$java.lang.Object

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

(source my-defined-fn)

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

有什么办法吗?谢谢。

【问题讨论】:

  • 不是重复的,该函数要求使用 REPL 打印 .clj 文件中定义的函数的源代码。这个问题是关于打印未在任何文件中定义的函数的源代码(至少如果我没看错的话)
  • @Arthur Ulfeldt,够公平

标签: clojure


【解决方案1】:

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

你得到的最好的结果是在 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))
...

在元数据中不包括完整的源代码是为了在正常情况下节省内存,尽管这样做确实不太方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2014-04-04
    • 2011-08-07
    • 2011-11-15
    相关资源
    最近更新 更多