如何检查Clojure代码是否在REPL中被评估?

6

我希望根据代码是从REPL运行还是运行编译后的jar文件,以不同的格式来格式化我的日志。

有没有简单的方法可以做到这一点?我在想也许Leiningen在运行REPL时留下了某种痕迹。

1个回答

4
(defn current-stack-trace []
      (.getStackTrace (Thread/currentThread)))

(defn is-repl-stack-element [stack-element]
      (and (= "clojure.main$repl" (.getClassName  stack-element))
           (= "doInvoke"          (.getMethodName stack-element))))

(defn is-in-repl []
      (some is-repl-stack-element (current-stack-trace)))

(defn my-log [msg]
      (if (is-in-repl)
          (prn (str "RUNNING IN REPL : " msg))
          (prn msg)))

不错的技巧!我一直在寻找某种存储在某处的变量,但我想堆栈完全可以胜任 :) - noziar
1
你可能想要进行记忆化处理,这可能会很耗费资源。 - pete23
这仅适用于在启动后实际在REPL中执行的代码。当REPL正在启动并预加载您的命名空间时,该函数不在堆栈跟踪中。 - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接