2015-12-31 23 views
5

OCaml Uzantı Noktaları hakkında daha fazla bilgi almaya çalışıyorum ve AST'deki kayıt türlerinin temsilini takiben sorun yaşıyorum. ocamlc -dparsetree fool.ml aitOCaml AST kayıt tipi gösterimi

let _ = [%getenv "USER"] 

Ve çıktı: Kaynak dosyayı (foo.ml) kullanarak

http://whitequark.org/blog/2014/04/16/a-guide-to-extension-points-in-ocaml/

: Ben bu blog yayınında aşağıdaki örneğe çalıyorum

:

[ 
    structure_item (test.ml[1,0+0]..[1,0+24]) 
    Pstr_eval 
    expression (test.ml[1,0+8]..[1,0+24]) 
     Pexp_extension "getenv" 
     [ 
      structure_item (test.ml[1,0+17]..[1,0+23]) 
      Pstr_eval 
      expression (test.ml[1,0+17]..[1,0+23]) 
       Pexp_constant Const_string("USER",None) 
     ] 
    ] 

Asttypes.mli ve parsetree.mli'den ayrıştırma işlemini takip edebilirim

Pexp_constant Const_string("USER",None) 

Ancak hattın ağaç desen eşleştirme, artık ayrıştırma ağacı kayıt türlerini temsil durumlarda neler olduğunu takip edebilirsiniz. Kayıt alanlarının, tür tanımında göründükleri sırayla değil aynı zamanda, ayrıştırıcı ağacında tüm alanların (veya gösterilmesinin) gerekli olmadığı gösterilmektedir. parsetree.mli itibaren

:

type expression = { 
    pexp_desc: expression_desc; 
    pexp_loc: Location.t; 
    pexp_attributes: attributes; 
} 

ayrıştırma ağacı çıkışı sadece konumu ve yükünü göstermek gibi görünüyor, ama muhtemelen yanlış bu okuyorum.

Kayıt türleri için AST'yi nasıl doğru okurum? Tip ifadesi için:

(* record type declaration and pexp_loc field *) 
expression (test.ml[1,0+8]..[1,0+24]) 
    (* pexp_desc field *) 
    Pexp_extension "getenv" 
    [ 
     ... 
    ] 
+1

Sorunuzu anladığımdan emin değilim. pexp_desc, AST'nin gerçek açıklamasıdır (büyük bir toplam tipi). -sourcetree sadece bir şematik temsil, AST gerçek OCaml değeri değil. – Drup

cevap

2

AST'leri incelemek ve uzantıları kullanabilmek için gerekli araçları kaçırıyorsunuz gibi görünüyor. Bu araçlar Alain Frisch tarafından yazılan ppx_tools'dur. Bu araçlardan biri, AST'lerin somut gösterimini araştırmak için tasarlandı, adı dumpast. Aşağıdaki dosyaya ast_record.mli bunu uygulayalım:

type card = { 
    name: string; 
    address: string; 
    age: int; 
} 

çıktı plak sırası korunur teyit

ocamlfind ppx_tools/dumpast ast_record.mli   
ast_record.mli 
==> 
[{psig_desc = 
    Psig_type 
    [{ptype_name = {txt = "card"}; ptype_params = []; ptype_cstrs = []; 
     ptype_kind = 
     Ptype_record 
     [{pld_name = {txt = "name"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}}; 
     {pld_name = {txt = "address"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "string"}, [])}}; 
     {pld_name = {txt = "age"}; pld_mutable = Immutable; 
      pld_type = {ptyp_desc = Ptyp_constr ({txt = Lident "int"}, [])}}]; 
     ptype_private = Public; ptype_manifest = None}]}] 
========= 

olduğunu.

arada, bana bu ppx_tools kaynak kodunu ve belki de LWT sevk ppx uzantısı incelemek için önerdiğimiz. Oldukça kısa ve çok iyi yazılmış ve yeniden üretilebilir bir ilham kaynağıdır.