1

SML 用の "いい" ロギング/デバッグ ライブラリはありますか? 一部の Java コードをミラーリングすることを目的とした SML コードをデバッグしています。両方のプログラムが計算中に中間値を出力することに興味があります。私は、このライブラリが C/Java の に似たものを取得することを発見しましprintf()た。これは大きな助けになります。Java 用の優れたロギング ライブラリはたくさんあるので、問題はないはずです。

ただし、SML に print ステートメントを追加すると、途方もない数のコード行が追加され、一般的に見栄えが悪く、見栄えが悪くなります。これを行う良い方法はありますか?たぶん、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 
4

1 に答える 1

1

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)

確かに、追加の無名関数はあまり良くありませんが、式が潜在的にクラッシュprint "Hmm"する前に の効果を発生させたい場合は必要です。2 + x

デバッグ フラグが必要な場合は、代わりにこのチェックをトレース関数に埋め込むことができます。

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

... wheredebugは以前に定義されています。

于 2013-11-12T08:17:01.240 に答える