Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Caml-list] camlp4 module dependencies

3 views
Skip to first unread message

Harrison, John R

unread,
Sep 21, 2008, 2:05:45 PM9/21/08
to OCaml, Harrison, John R
I'm trying once again to make some code work under the new camlp4. I
don't want to make any real syntax modifications, but just enable
quotations performing a simple string transformation on the body of
the quotation, e.g. turning

<<hello /\ world>>

into

default_parser "hello /\\ world"

About a year ago, Nicolas Pouillard gave me a recipe, which I've now
put in the following form for my actual requirements:

open Camlp4.PreCast;;

module Caml =
Camlp4OCamlParser.Make
(Camlp4OCamlRevisedParser.Make
(Camlp4.OCamlInitSyntax.Make(Ast)(Gram)(Quotation)));;

let quotexpander s =
if String.sub s 0 1 = "|" & String.sub s (String.length s - 1) 1 = "|" then
"secondary_parser \""^
(String.escaped (String.sub s 1 (String.length s - 2)))^"\""
else "default_parser \""^(String.escaped s)^"\"";;

let patt_quotexpander loc _loc_name_opt str =
Gram.parse_string Caml.patt loc (quotexpander str);;

let expr_quotexpander loc _loc_name_opt str =
Gram.parse_string Caml.expr loc (quotexpander str);;

let str_item_quotexpander loc loc_name_opt str =
<:str_item@loc< $exp: expr_quotexpander loc loc_name_opt str$ >>;;

let () =
Syntax.Quotation.add "" Syntax.Quotation.DynAst.expr_tag expr_quotexpander;
Syntax.Quotation.add "" Syntax.Quotation.DynAst.str_item_tag
str_item_quotexpander;
Syntax.Quotation.add "" Syntax.Quotation.DynAst.patt_tag patt_quotexpander;;

I can directly compile this file (say "Quotexpander.ml") with

ocamlc -pp camlp4of -I +camlp4 -I +camlp4/Camlp4Parsers -a -o Quotexpander.cma Quotexpander.ml

and then use it inside the toplevel without problems:

/home/johnh/temp/OCaml$ ocaml
Objective Caml version 3.10.0

# #load "camlp4o.cma";;
Camlp4 Parsing version 3.10.0

# #load "Quotexpander.cma";;
# let default_parser s = s;;
val default_parser : 'a -> 'a = <fun>
# <<hello /\ world>>;;
- : string = "hello /\\ world"

However, to keep the build process as trivial as possible, I'd like
simply to copy the ML code directly into the toplevel (i.e. #use
"Quotexpander.ml"). Doing this seems to hit some module dependencies,
e.g.

$ ocaml
Objective Caml version 3.10.0

# #load "camlp4o.cma";;
Camlp4 Parsing version 3.10.0

# open Camlp4.PreCast;;
# module Caml =
Camlp4OCamlParser.Make
(Camlp4OCamlRevisedParser.Make
(Camlp4.OCamlInitSyntax.Make(Ast)(Gram)(Quotation)));;
Unbound module Camlp4OCamlParser.Make
...

Can anyone tell me what else I should be loading/opening?

John.

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Nicolas Pouillard

unread,
Oct 9, 2008, 2:37:34 PM10/9/08
to John Harrison, Caml_mailing list
Excerpts from John Harrison's message of Sun Sep 21 20:05:36 +0200 2008:

> I'm trying once again to make some code work under the new camlp4. I
> don't want to make any real syntax modifications, but just enable
> quotations performing a simple string transformation on the body of
> the quotation, e.g. turning
>

[...]

> Can anyone tell me what else I should be loading/opening?

You have to add the include directories:

$ ocaml camlp4of.cma -I +camlp4 -I +camlp4/Camlp4Parsers

Regards,

--
Nicolas Pouillard aka Ertai

signature.asc
0 new messages