コマンド ライン ツールとして使用するプログラムがある場合、デバッグのオプションは何ですか?
例として、プログラムが次のようになっているとします。
のリストdo_stuff.pl
:
main :-
current_prolog_flag(argv, Argv),
do_stuff(Argv),
halt.
main :-
halt(1).
SWI-Prolog を使用すると、次のようにコンパイルできます。
swipl --goal=main -o do_stuff -c do_stuff.pl
そして、単に呼び出すだけで実行できます
$ ./do_stuff foo bar baz
現状では、失敗した場合、これは 1 で終了しdo_stuff/1
ます。失敗した最初の (最も早く、最も深い) ゴールを確認するにはどうすればよいですか? またはさらに良いことに、バックトレース全体ですか?たとえば、次のようにdebug
andを使用できるはずだと思いました。leash
main :-
current_prolog_flag(argv, Argv),
debug, leash(+fail),
do_stuff(Argv),
halt.
...しかし、私が試したものは何もありませんでした。
私が持っていた唯一の中途半端なアイデアは、決定論的に成功すると予想しているが成功しないすべての述語に対してエラーをスローすることでした。これはもちろん実行可能ですが、少し過剰に思えますか?
動機
コマンド ライン ツールとして使用されるプログラムは、(通常) 1 回実行し、引数を取り、入力を読み取り、出力を書き込むことを意図しています。この場合、失敗とは何を意味するのでしょうか。私の解釈では、予期しない失敗はプログラムのエラーです。
単体テストが役立つ場合があります (述語を分離してテストします)。ただし、これは定義上、プログラマーが問題、スコープ、またはツールを理解していないために発生するエラーには役立ちません。現実的な入力でプログラムを実行するだけで、このクラスのエラーが検出されます。
上記の例で、特定のユースケースが原因do_stuff/1
で失敗し、プログラムがゼロ以外のコードで終了した場合、プログラマーはどの述語が失敗したかを判断するためにどのような選択肢があるでしょうか?
コメントにリンクされている回答は、 1つの解決策を提供します。しかし、(私が正しく理解していれば) これには、問題の述語呼び出しが見つかるまで、プログラマーが実行フローに沿って体系的にチェックする必要があります。
これはまさに私が避けたかったことです。