私はパーセックで作業しており、コードのデバッグに問題があります。たとえば、ghci でブレークポイントを設定することはできますが、どのくらいの入力が消費されたかなどを確認する方法がわかりません。
parsec コードのデバッグに役立つツールやガイドラインはありますか?
このページが役立つかもしれません。
Debug.trace
printf
はあなたの友達です。基本的にデバッグを行うことができます。最初の引数を評価して出力し、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 1
とx 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
して何がループしているかを確認できます。
Text.Parsec.Prim で演算子を使用し<?>
て、自分とユーザーにとってより良いエラー メッセージを作成できる場合があります。Real World Haskell にいくつかの例があります。パーサーに優れたサブパーツがある場合は、いくつかの簡単なテストをセットアップ (またはHUnitを使用) して、期待どおりに個別に動作することを確認できます。