2012-01-05 4 views
1

私はこのようないくつかのコードを持っている:最後のletバインディングに文字列としてアクセスできるcamlp4構文拡張を記述することはできますか?

let full   = Var({name ="full"; value = F});; 

私はむしろ「フ​​ルを繰り返す必要はありませたい:私は私がしなければならない変数を作成したい場合は後で

type boolean = T | F 
    type bexp = Const of boolean 
    | Var of variable 
    | Bop of bop * bexp * bexp 
    | Not of bexp 
    and bop = And | Or | Xor 
    and variable = { name: string; mutable value: boolean } 

を'を2回繰り返し、名前を文字列として取得するための内観的な方法を考え出したいと思います。私はcamlp4がこれで動くかもしれないと思っていますが、どこから始めたらいいのかわかりません。

let full   = Var({name = :letname:; value = F});; 

:letnameは:の代わりに文字列として結合現在のLETで(この場合は「フル」)を埋めるだろう

だから、最終的には私のような何かを行うことができるようにしたいのですが。 (構文:letname:?ちょうど提案、OCamlでの構文と衝突しません構文については、他のアイデアです)

は、このような、より簡潔な構文がおそらく望ましいでしょう:

その後、希望
var full = F 

以下のように展開してください:

let full = Var({name = "full"; value = F});; 

これはcamlp4で可能ですか?もしそうなら、どうすればいいですか?

(さらに考慮すると、:letname:構文または類似した何かが、より汎用的かつ複数の領域で有用であろう)

答えて

3

以下を試してください。するために、このようなtest.ml

(* A simple syntax extension for getting the name of an identifier. *) 
open Camlp4 

(* Create an ID for the macro*) 
module Id : Sig.Id = struct 
    let name = "let'" 
    let version = "1.0" 
end 

module Make (Syntax : Sig.Camlp4Syntax) = struct 
    open Sig 
    include Syntax 

    (* Extend the syntax with a let' x=e1 in e2 construction*) 
    EXTEND Gram 
    expr: [ 
     [ "let'"; x = patt ; "=" ; e1=expr; "in"; e2=expr -> 
      let name=begin match x with 
       | Ast.PaId (_,Ast.IdLid(_,name)) -> name 
       | _ -> failwith "Require an identifier in a let' statement." 
      end in 
      <:expr< 
       let $x$ = $e1$ in ($str:name$,$e2$) 
      >> 
     ] 
    ]; 
    END 
end 

module M = Register.OCamlSyntaxExtension(Id)(Make) 

次に、そしてトップレベル

ocaml dynlink.cma -I +camlp4 camlp4of.cma 

ocamlc -c -I +camlp4 dynlink.cma camlp4lib.cma -pp camlp4of.opt test.ml 

でコンパイル

# #load "test03.cmo";; 
# let' x=1 in x;; 
- : string * int = ("x", 1) 

として別ファイルに拡張機能でコンパイルして別のファイルを作成するこうした次にtest2.ml

let' x=1 in x 

ocamlc -pp "camlp4of test.cmo" test2.ml 
0

はい、これが可能です。まず、camlp4チュートリアルを読んで、その動作を理解し、より具体的な質問をしてください。

+0

[OK]をクリックしてコンパイルして、私はCamlp4のと、この時の私の最初の試みについての質問を投稿しました。 – aneccodeal

関連する問題