Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 当参数是大映射时跟踪函数_Clojure_Trace - Fatal编程技术网

Clojure 当参数是大映射时跟踪函数

Clojure 当参数是大映射时跟踪函数,clojure,trace,Clojure,Trace,当我跟踪一个函数时,如果其中一个参数是一个包含很多元素的嵌套映射,那么跟踪将充满混乱。下面是一个典型的例子: TRACE t36705: (get-value {:nodeclass :simple, :nodeid :simple25, :dock {:constan t-dock {:name :constant-dock, :value 22, :dockclass {:name :constant-dock, :link -policy {:lp-committed? #object[f

当我跟踪一个函数时,如果其中一个参数是一个包含很多元素的嵌套映射,那么跟踪将充满混乱。下面是一个典型的例子:

TRACE t36705: (get-value {:nodeclass :simple, :nodeid :simple25, :dock {:constan
t-dock {:name :constant-dock, :value 22, :dockclass {:name :constant-dock, :link
-policy {:lp-committed? #object[fargish.links$fn__5756 0x407956a5 "fargish.links
$fn__5756@407956a5"], :lp-reciprocate-no-commitment #object[clojure.core$constan
tly$fn__4614 0x69497a36 "clojure.core$constantly$fn__4614@69497a36"], :lp-recipr
ocate-commitment #object[clojure.core$constantly$fn__4614 0x30ee413a "clojure.co
re$constantly$fn__4614@30ee413a"], :lp-can-boost-to #object[fargish.links$fn__57
58 0x5df17e60 "fargish.links$fn__5758@5df17e60"], :lp-official-partners #object[
fargish.links$fn__5760 0x3df2f4ab "fargish.links$fn__5760@3df2f4ab"], :lp-normal
ize-after-add #object[clojure.core$constantly$fn__4614 0x386cc1c4 "clojure.core$
constantly$fn__4614@386cc1c4"], :lp-reduce-to-uncommitted #object[fargish.links$
fn__5765 0x7bd4f212 "fargish.links$fn__5765@7bd4f212"], :lp-committed-to #object
[fargish.links$fn__5767 0x5c3cc103 "fargish.links$fn__5767@5c3cc103"], :lp-boost
 #object[fargish.links$fn__5771 0x423e35f0 "fargish.links$fn__5771@423e35f0"]}, 
:maker #object[fargish.spec_test$eval36501$__GT_Dock_constant_dock__36515 0x19cc
229b "fargish.spec_test$eval36501$__GT_Dock_constant_dock__36515@19cc229b"]}}, :
function-dock {:name :function-dock, :value #fargish.spec.Vfunc{:args (constant-
dock), :f #object[fargish.spec_test$fn__36544 0x135647d3 "fargish.spec_test$fn__
36544@135647d3"]}, :dockclass {:name :function-dock, :link-policy {:lp-committed
? #object[fargish.links$fn__5756 0x407956a5 "fargish.links$fn__5756@407956a5"], 
:lp-reciprocate-no-commitment #object[clojure.core$constantly$fn__4614 0x69497a3
6 "clojure.core$constantly$fn__4614@69497a36"], :lp-reciprocate-commitment #obje
ct[clojure.core$constantly$fn__4614 0x30ee413a "clojure.core$constantly$fn__4614
@30ee413a"], :lp-can-boost-to #object[fargish.links$fn__5758 0x5df17e60 "fargish
.links$fn__5758@5df17e60"], :lp-official-partners #object[fargish.links$fn__5760
 0x3df2f4ab "fargish.links$fn__5760@3df2f4ab"], :lp-normalize-after-add #object[
clojure.core$constantly$fn__4614 0x386cc1c4 "clojure.core$constantly$fn__4614@38
6cc1c4"], :lp-reduce-to-uncommitted #object[fargish.links$fn__5765 0x7bd4f212 "f
argish.links$fn__5765@7bd4f212"], :lp-committed-to #object[fargish.links$fn__576
7 0x5c3cc103 "fargish.links$fn__5767@5c3cc103"], :lp-boost #object[fargish.links
$fn__5771 0x423e35f0 "fargish.links$fn__5771@423e35f0"]}, :maker #object[fargish
.spec_test$eval36523$__GT_Dock_function_dock__36537 0x34584446 "fargish.spec_tes
t$eval36523$__GT_Dock_function_dock__36537@34584446"]}}}} constant-dock)
TRACE t36705: => nil

什么是一种技术,可以让这些痕迹打印出来而不会有太多的混乱?我不希望跟踪非常容易阅读,但必须有比这更好的方法。

不幸的是,
clojure.tools.trace
不允许自定义跟踪日志的输出。我不确定您是否可以在运行之间修改源代码,或者是否需要一种机制来插入运行中的系统,在该系统中您无法修改函数实现

从您的评论来看,您似乎可以修改要跟踪的函数。根据您只记录函数参数内容的子集的要求,我将切换到普通日志记录(使用
println
或一些日志框架),并添加显式日志表达式以仅记录相关数据

例如:

(defn some-function
  [a b]
  (println "some-function" {:a (select-keys a [:x :y]) :b (select-keys b [:x :z])})
  (comment your function body))

defn
更改为
deftrace
并不容易,但可以按照您的意愿进行自定义。

您是否尝试过胡闹?如何设置跟踪?你想解决什么问题?也许有更好的工具,但这取决于您的具体情况。@Alex我可能做错了什么,但是
*打印级别*
*打印长度*
似乎对
clojure.trace
没有影响。我主要使用
lein测试刷新:对于repl
@PiotrekBzdyl,我使用跟踪解决的问题因情况而异。我最想知道的是,对于如何处理像大地图这样的痕迹,人们已经形成了什么样的共识。上面的跟踪中有很多函数对象,因为它包含一个方法映射。由于其他原因,其他记录道可能较大。设置跟踪的方法通常是在源代码中将
defn
更改为
deftrace
。我有了
lein测试刷新:repl
在一个窗口中运行,这样每次我保存代码时,我的测试都会运行,所有被跟踪的函数都会被跟踪。啊,
选择键
!作为Clojure的新手,许多常见的、经常有用的核心功能还没有在我脑海中浮现。我还没有对任何东西使用
选择键
,但我会在下一次使用大地图艰难地通过跟踪时使用它。