compile
OCaml プログラムを含む文字列を受け取り、コンパイルの結果を Correct または Error として出力する関数を持つ OCaml モジュールを書きたいと思います。また、Error の場合は、最初のエラーの行と文字に関する情報を出力します。エラーが何であったかは気にしません(少なくとも今のところ)。
このための基本的なモジュール タイプは次のとおりです。
module type Compile =
sig
type result = Correct | Error of (int*int)
val compile : string -> result
end
それを実装するには、少なくとも 2 つの根本的に異なる方法があります。
- 簡単なハック方法-- プログラムで文字列をファイルに書き込み、Unix プロセスを使用
ocamlc
してコマンド ラインで呼び出し、stderr を解析します。 - 適切な方法-- OCaml ツールを使用してコードを分析します。
(1)については、stderrの中身がつかめず困っています。を使用することから始めました
。これによりUnix.open_process_in
、stdout が in_channel にリダイレクトされ、それを読み取ることができます。コンパイルエラーは標準エラー出力に出力されるocamlc
ため(標準出力には出力されません)、使用しようとしました
let ic = Unix.open_process_in "ocamlc test.ml 2>&1"
stderr の内容がコマンド ラインで stdout にリダイレクトされるようにします。ic
このようにすると、コンパイルエラーが含まれると思います。残念ながら、これは事実ではなくic
、End_of_file
.
次にUnix.create_process
、out、in、err の新しいチャネルを選択できるコマンドに移動しました。しかし、これらのチャネルを選択するのに問題があります。プログラムでそれを読み取ることができるようにするには、出力チャネルをどのようにする必要がありますか?
(2)に関して、(合理的に)簡単な方法は何だと思いますか?
助けてくれてありがとう!