2016-05-20 10 views
3

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";;ことを行うならば、私はToploopParsetreeモジュールにアクセスすることができますが、私はLocationモジュールにアクセスすることはできません!その理由は何ですか?私は.cmoファイルを私のソースディレクトリからロードすることが非常に魅力的であることがわかります。

ソースツリーを使用することなく、私が望むことをする方法がありますか?

つまり、ToploopLocationの違いは、この点でどうしてですか?要するに

答えて

8

は、何をロードする必要は.cmoファイルが、+compiler-libsディレクトリにある

#load "ocamlcommon.cma";; 

個別ではありません。

ParsetreeToploopLocationの違いは微妙です... OCamlでは

、データ型とそのコンストラクタは(#directory "<dir>"による)ロードパスにそのディレクトリを追加することでアクセス可能になります。オブジェクトコードのロード(#loadによる)は必要ありません。

Parsetreeは、「mli only module」と呼ばれ、データ型定義のみを持ち、値が定義されていません。したがって、Parsetreeのすべては、ロード・パスに入れるだけでアクセスできます。

Locationはタイプと値を定義します。そのデータ型とコンストラクタはオブジェクトファイルをロードせずにアクセスできますが、値にはロードが必要です。この場合、オブジェクトlocation.cmoは、それをアーカイブするocamlcommon.cmaをロードするとロードされます。

Toploopはトリッキーなものです。 Toploopの値にアクセスすることもできます。toploop.cmoがロードされます。ToploopはOCamlのトップレベルで既に利用可能であるため、アクセスすることができます。

+0

偉大な答えをありがとう!これは私の問題を完全に解決しました。 –

+1

私の混乱は、Coqユーザーとして、コンストラクターと関数を同じ種類のものと考え、 'Parsetree.Ptop_def' *が許可されたということでした。だから私は 'Toploop'と' Parsetree'の違いを見逃した。答えともっと明確な説明に感謝します。 –

関連する問題