OCaml入力ファイルの先頭にいくつかの行のコードを入れて、最後の式を常に最後に覚えておいてit
の名前で覚えておきたいと思います。つまり、私が持っていると思います:カスタムトップレベルを構築せずにOCamlコンパイラからモジュールを開く
# 3 + 4;;
val it : int = 7
# it;;
val it : int = 7
# let foo = 42;;
val foo : int = 42
# it + 130;;
val it : int = 137
#
しかし、私は、カスタムトップレベルを構築したり、camlp5
またはそのような派手なものを使用する必要はありません。
私は現在、(OCamlのバージョン4.02.3で、私はそのバージョンを持っている理由私は知らない。しかし、私は正確なバージョンは関係ありません願っています?)何以下の通りです:
#directory "+compiler-libs";;
#load "/opt/src/ocaml-4.02.3/utils/warnings.cmo";;
#load "/opt/src/ocaml-4.02.3/parsing/location.cmo";;
let convert_phrase x =
match x with
| Parsetree.Ptop_def
[{Parsetree.pstr_desc = Parsetree.Pstr_eval (e, a)}] ->
Parsetree.Ptop_def
([{Parsetree.pstr_desc =
Parsetree.Pstr_value (Asttypes.Nonrecursive,
[{Parsetree.pvb_pat =
{Parsetree.ppat_desc =
Parsetree.Ppat_var (Location.mknoloc "it");
Parsetree.ppat_loc = Location.none;
Parsetree.ppat_attributes = []};
Parsetree.pvb_expr = e;
Parsetree.pvb_attributes = a;
Parsetree.pvb_loc = Location.none}]);
Parsetree.pstr_loc = Location.none}])
| x -> x;;
Toploop.parse_toplevel_phrase :=
let parse_toplevel_phrase = !Toploop.parse_toplevel_phrase in
fun x -> convert_phrase (parse_toplevel_phrase x);;
そしてその種の作品。
私の質問:私はちょうど#directory "+compiler-libs";;
ことを行うならば、私はToploop
とParsetree
モジュールにアクセスすることができますが、私はLocation
モジュールにアクセスすることはできません!その理由は何ですか?私は.cmo
ファイルを私のソースディレクトリからロードすることが非常に魅力的であることがわかります。
ソースツリーを使用することなく、私が望むことをする方法がありますか?
つまり、Toploop
とLocation
の違いは、この点でどうしてですか?要するに
偉大な答えをありがとう!これは私の問題を完全に解決しました。 –
私の混乱は、Coqユーザーとして、コンストラクターと関数を同じ種類のものと考え、 'Parsetree.Ptop_def' *が許可されたということでした。だから私は 'Toploop'と' Parsetree'の違いを見逃した。答えともっと明確な説明に感謝します。 –