gpt4 book ai didi

java - SML 中的 printf 调试

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:16 25 4
gpt4 key购买 nike

是否有一个“不错的”SML 日志记录/调试库?我正在调试一些旨在镜像某些 Java 代码的 SML 代码。我感兴趣的是让两个程序在计算过程中打印出中间值。我找到了this库来获得类似于 C/Java 的 printf() 的东西,这是一个很大的帮助。 Java 有很多优秀的日志库,因此应该不会有任何问题。

但是,向 SML 添加打印语句会增加大量可笑的代码行,而且通常看起来又丑又糟糕。有没有一个好的方法来做到这一点?甚至可能是 Python 的装饰器之类的东西?

这是我所指的示例。使用日志记录:

fun execute (points : Point.t list,
nClusters : int,
threshold : real,
randomPtr : Random.rand,
debug : bool) =
let
(* helper function for debugging *)
fun printIterationInfo (index, points) =
print(genericDebugFmt "\nLoop iteration index: "
index
"\npoints: "
(map Point.featuresRepr points))
val initialClusters = initializeClusters(points, nClusters, randomPtr, debug)
val _ = if debug then
printIterationInfo (~1, initialClusters)
else ()
fun loop (10, clusterCenters) =
if debug then
(printIterationInfo (10, clusterCenters);
clusterCenters)
else
clusterCenters
| loop (index, clusterCenters) =
(* wow, adding logging is cumbersome... *)
let
val ans = work(points, clusterCenters, debug)
in
if debug then
(printIterationInfo (index, ans);
loop (index + 1, ans))
else
loop(index + 1, ans)
end
in
loop (0, initialClusters)
end
end

没有日志记录:

fun execute (points : Point.t list,
nClusters : int,
threshold : real,
randomPtr : Random.rand,
debug : bool) =
let
val initialClusters = initializeClusters(points, nClusters, randomPtr, debug)

fun loop (10, clusterCenters) = clusterCenters
| loop (index, clusterCenters) =
loop(index + 1, ans)
in
loop (0, initialClusters)
end
end

最佳答案

SML 有 printf: http://mlton.org/Printf

它可能会使一些打印语句看起来更漂亮,但它并不能解决在程序中随处添加打印调试的冗长问题。

如果您想要侵入性较小的调试功能,请尝试执行 Haskell 的跟踪之类的操作:

fun trace msg f = (print msg; f ())

而不是

fun foo x = 2 + x

你愿意

fun foo x = trace "Hmm" (fn _ => 2 + x)

诚然,额外的匿名函数不是很好,但是如果我们希望在表达式 2 + x 之前出现 print "Hmm" 的效果,那么这个额外的匿名函数是必要的可能会崩溃。

现在,如果您想要调试标志,您可以将此检查嵌入到跟踪函数中:

fun trace msg thunk = (if debug then print msg else (); thunk ())

...其中 debug 是之前定义的。

关于java - SML 中的 printf 调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19904193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com