如何插入clojure函数中的repl并打印堆栈跟踪

如何插入clojure函数中的repl并打印堆栈跟踪,clojure,Clojure,给定以下函数 (defn func [] (break!)) 我要休息!函数启动repl,在该repl中,我可以打印调用func的调用堆栈 该功能类似于Python中的ipdb,当我们想要在某个函数的运行时内部进行交互研究时,它非常方便。非常基本的版本可能是: (定义中断![](clojure.main/repl)) 这将启动一个新的嵌套REPL,当您退出它时(在Windows上使用^D--或^Z),它将继续运行 你不能计算局部变量,但是如果你写break作为宏,您至少可以在启动REPL

给定以下函数

(defn func []
  (break!))
我要休息!函数启动repl,在该repl中,我可以打印调用
func
的调用堆栈


该功能类似于Python中的
ipdb
,当我们想要在某个函数的运行时内部进行交互研究时,它非常方便。

非常基本的版本可能是:

(定义中断![](clojure.main/repl))
这将启动一个新的嵌套REPL,当您退出它时(在Windows上使用^D--或^Z),它将继续运行

你不能计算局部变量,但是如果你写
break作为宏,您至少可以在启动REPL之前显示活动的局部变量:

user=>(定义宏中断![]
(让[locals(进入{}(map(juxt关键字标识))(keys&env))]
(prn本地人)
(clojure.main/repl:prompt#(打印“嵌套>”))
#'用户/中断!
user=>(defn foo“使用break!函数。”[ab](break!))
#'用户/foo
用户=>(foo 13 42)
{:a 13,:b 42}
嵌套>(doc foo)
-------------------------
用户/foo
([a b])
利用休息时间!功能。
无
嵌套>^D
无
用户=>

如果希望stacktrace作为嵌套REPL中的数据,可以计算
(:trace(Throwable->map(Throwable.))

非常基本的版本可能是:

(定义中断![](clojure.main/repl))
这将启动一个新的嵌套REPL,当您退出它时(在Windows上使用^D--或^Z),它将继续运行

你不能计算局部变量,但是如果你写
break作为宏,您至少可以在启动REPL之前显示活动的局部变量:

user=>(定义宏中断![]
(让[locals(进入{}(map(juxt关键字标识))(keys&env))]
(prn本地人)
(clojure.main/repl:prompt#(打印“嵌套>”))
#'用户/中断!
user=>(defn foo“使用break!函数。”[ab](break!))
#'用户/foo
用户=>(foo 13 42)
{:a 13,:b 42}
嵌套>(doc foo)
-------------------------
用户/foo
([a b])
利用休息时间!功能。
无
嵌套>^D
无
用户=>
如果希望stacktrace作为嵌套REPL中的数据,可以计算
(:trace(Throwable->map(Throwable.))