9

私はパーセックで作業しており、コードのデバッグに問題があります。たとえば、ghci でブレークポイントを設定することはできますが、どのくらいの入力が消費されたかなどを確認する方法がわかりません。

parsec コードのデバッグに役立つツールやガイドラインはありますか?

4

3 に答える 3

9

このページが役立つかもしれません。

Debug.traceprintfはあなたの友達です。基本的にデバッグを行うことができます。最初の引数を評価して出力し、2 番目の引数を返します。したがって、次のようなものがある場合

foo :: Show a => a -> a
foo = bar . quux

foo次のように変更することで、foo のパラメーターの「値」をデバッグできます。

import Debug.Trace(trace)

foo :: Show a => a -> a
foo x = bar $ quux $ trace ("x is: " ++ show x) x

foo は以前と同じように機能するようになりましたが、呼び出すfoo 1x is: 1、評価時に stderr に出力されます。

より詳細なデバッグを行うには、GHCI のデバッグ コマンドを使用する必要があります。:force具体的には、変数の評価を強制して出力するコマンドを探しているようです。(別の方法は、:printそれ以上評価せずに、評価された変数を出力するコマンドです。)

は、変数の内容を理解するのにより役立ちますが、プログラムのセマンティクスを変更する可能性があることに注意して:forceください (プログラムが遅延に依存している場合)。

一般的な GHCI デバッグ ワークフローは次のようになります。

  • :breakブレークポイントの設定に使用
  • :listとを使用:show contextして、コードのどこにいるかを確認します
  • :show bindings変数バインディングを確認するために使用します
  • を使用:printして、現在バインドされているものを確認してください
  • :force必要に応じてバインディングを確認するために使用します

無限ループをデバッグしようとしている場合は、次を使用することも役立ちます

  • :set -fbreak-on-error
  • :trace myLoopingFunc x y

次に、ループ中にヒットCtrl-Cし、使用:historyして何がループしているかを確認できます。

于 2012-02-28T16:43:40.437 に答える
5

Text.Parsec.Prim で演算子を使用<?>て、自分とユーザーにとってより良いエラー メッセージを作成できる場合があります。Real World Haskell にいくつかの例があります。パーサーに優れたサブパーツがある場合は、いくつかの簡単なテストをセットアップ (またはHUnitを使用) して、期待どおりに個別に動作することを確認できます。

于 2012-02-28T18:04:19.170 に答える