* [Caml-list] Camlp4: generating printers of types
@ 2002-10-09 13:13 Daniel de Rauglaudre
2002-10-09 17:18 ` Markus Mottl
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Daniel de Rauglaudre @ 2002-10-09 13:13 UTC (permalink / raw)
To: caml-list
Hi everybody,
In Camlp4 tutorial (current version), I added a section explaining how
to make a syntax extension which, when loaded, automatically generates
printers of all your types:
For example, if your input file contains:
type colour = Red | Green | Blue
this will be interpreted like this:
type colour = Red | Green | Blue
let print_colour =
function
Red -> print_string "Red"
| Green -> print_string "Green"
| Blue -> print_string "Blue"
If you are interested, this is here:
http://caml.inria.fr/camlp4/tutorial.new/tutorial007.html#toc51
--
Daniel de RAUGLAUDRE
daniel.de_rauglaudre@inria.fr
http://cristal.inria.fr/~ddr/
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-10-09 13:13 [Caml-list] Camlp4: generating printers of types Daniel de Rauglaudre
@ 2002-10-09 17:18 ` Markus Mottl
2002-10-25 19:20 ` Ken Rose
2002-12-10 2:01 ` Ken Rose
2 siblings, 0 replies; 10+ messages in thread
From: Markus Mottl @ 2002-10-09 17:18 UTC (permalink / raw)
To: Daniel de Rauglaudre; +Cc: caml-list
On Wed, 09 Oct 2002, Daniel de Rauglaudre wrote:
> In Camlp4 tutorial (current version), I added a section explaining how
> to make a syntax extension which, when loaded, automatically generates
> printers of all your types:
Thanks a lot, this looks very interesting! Especially debugging might
become much easier with this, because one wouldn't have to adapt
pretty-printers all the time when types change during development.
Regards,
Markus Mottl
--
Markus Mottl markus@oefai.at
Austrian Research Institute
for Artificial Intelligence http://www.oefai.at/~markus
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-10-09 13:13 [Caml-list] Camlp4: generating printers of types Daniel de Rauglaudre
2002-10-09 17:18 ` Markus Mottl
@ 2002-10-25 19:20 ` Ken Rose
2002-10-25 20:02 ` Chris Hecker
2002-10-26 0:11 ` Daniel de Rauglaudre
2002-12-10 2:01 ` Ken Rose
2 siblings, 2 replies; 10+ messages in thread
From: Ken Rose @ 2002-10-25 19:20 UTC (permalink / raw)
To: Daniel de Rauglaudre; +Cc: caml-list
Daniel de Rauglaudre wrote:
>
> Hi everybody,
>
> In Camlp4 tutorial (current version), I added a section explaining how
> to make a syntax extension which, when loaded, automatically generates
> printers of all your types:
<snip>
>
> If you are interested, this is here:
> http://caml.inria.fr/camlp4/tutorial.new/tutorial007.html#toc51
I'm very interested, but unfortunately it doesn't work in ocaml-3.06.
Is it practical to make it work there (maybe by replacing pcaml with the
CVS versions)? How should that be done? I work on both Linux and
Windows.
Thanks
- ken
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-10-25 19:20 ` Ken Rose
@ 2002-10-25 20:02 ` Chris Hecker
2002-10-26 0:11 ` Daniel de Rauglaudre
1 sibling, 0 replies; 10+ messages in thread
From: Chris Hecker @ 2002-10-25 20:02 UTC (permalink / raw)
To: rose, Daniel de Rauglaudre; +Cc: caml-list
>I'm very interested, but unfortunately it doesn't work in ocaml-3.06.
>Is it practical to make it work there (maybe by replacing pcaml with the
>CVS versions)? How should that be done? I work on both Linux and
>Windows.
If you sync the cvs camlp4, ./configure, make, make install it should just
work.
Chris
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-10-25 19:20 ` Ken Rose
2002-10-25 20:02 ` Chris Hecker
@ 2002-10-26 0:11 ` Daniel de Rauglaudre
1 sibling, 0 replies; 10+ messages in thread
From: Daniel de Rauglaudre @ 2002-10-26 0:11 UTC (permalink / raw)
To: caml-list
Hi,
On Fri, Oct 25, 2002 at 12:20:33PM -0700, Ken Rose wrote:
> > http://caml.inria.fr/camlp4/tutorial.new/tutorial007.html#toc51
>
> I'm very interested, but unfortunately it doesn't work in ocaml-3.06.
I think that the only problem is that Pcaml.type_declaration is not
defined. Is it that? In this case, if you don't want to update the
current CVS version, you can use the trick I used in IoXML:
let type_declaration : Grammar.Entry.e 'a =
Obj.magic (Grammar.Entry.find Pcaml.str_item "type_declaration");;
and replace "Pcaml.type_declaration" by "type_declaration".
--
Daniel de RAUGLAUDRE
http://cristal.inria.fr/~ddr/
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-10-09 13:13 [Caml-list] Camlp4: generating printers of types Daniel de Rauglaudre
2002-10-09 17:18 ` Markus Mottl
2002-10-25 19:20 ` Ken Rose
@ 2002-12-10 2:01 ` Ken Rose
2002-12-10 12:25 ` Daniel de Rauglaudre
2002-12-10 13:20 ` Damien Doligez
2 siblings, 2 replies; 10+ messages in thread
From: Ken Rose @ 2002-12-10 2:01 UTC (permalink / raw)
To: Daniel de Rauglaudre; +Cc: caml-list
Daniel de Rauglaudre wrote:
>
> Hi everybody,
>
> In Camlp4 tutorial (current version), I added a section explaining how
> to make a syntax extension which, when loaded, automatically generates
> printers of all your types:
>
> For example, if your input file contains:
>
> type colour = Red | Green | Blue
>
> this will be interpreted like this:
>
> type colour = Red | Green | Blue
> let print_colour =
> function
> Red -> print_string "Red"
> | Green -> print_string "Green"
> | Blue -> print_string "Blue"
I've been working on extending this to more general types, which I
suppose would be easy for someone who's had some practice with camlp4.
I'm running into 2 problems, and anticipating a third one.
1. Is there a clean way to handle (sum) types with constructors with
multiple module qualifications? I hacked the example to deal with
Foo.bar, but it doesn't seem to extend automatically to Foo.Bar.baz. As
I understand it, I'd need a new pattern for each additional uid.
2. How are tuples represented in camlp4's syntax? This is so I can
match them when analyzing a type.
3. This is the big one. When working on a type like:
type t = int
with the obvious extention to Daniel's code, the preprocessor produces
type t = int let rec print_t = print_int
Which the compiler rejects with "This kind of expression is not allowed
as right-hand side of `let rec'" I haven't been able to figure out a
way to sneak it past, either. What's going on here? Why can't I rename
print_int?
Thanks
- ken
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-12-10 2:01 ` Ken Rose
@ 2002-12-10 12:25 ` Daniel de Rauglaudre
2002-12-10 15:33 ` Ken Rose
2002-12-10 13:20 ` Damien Doligez
1 sibling, 1 reply; 10+ messages in thread
From: Daniel de Rauglaudre @ 2002-12-10 12:25 UTC (permalink / raw)
To: caml-list
Hi,
On Mon, Dec 09, 2002 at 06:01:41PM -0800, Ken Rose wrote:
> 1. Is there a clean way to handle (sum) types with constructors with
> multiple module qualifications? I hacked the example to deal with
> Foo.bar, but it doesn't seem to extend automatically to Foo.Bar.baz. As
> I understand it, I'd need a new pattern for each additional uid.
I don't understand that: in the type definition, there is no qualifications
for the constructors.
> 2. How are tuples represented in camlp4's syntax? This is so I can
> match them when analyzing a type.
In Revised syntax, they are like in normal syntax, but the parentheses
are compulsory.
> 3. This is the big one. When working on a type like:
> type t = int
> with the obvious extention to Daniel's code, the preprocessor produces
> type t = int let rec print_t = print_int
> Which the compiler rejects with "This kind of expression is not allowed
> as right-hand side of `let rec'" I haven't been able to figure out a
> way to sneak it past, either. What's going on here? Why can't I rename
> print_int?
This message of OCaml just means that there are syntactic restrictions
of the "let rec". In this case, you should produce either a "let" without
"rec" or, an eta extension: "let rec print_t x = print_int x".
--
Daniel de RAUGLAUDRE
http://cristal.inria.fr/~ddr/
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-12-10 2:01 ` Ken Rose
2002-12-10 12:25 ` Daniel de Rauglaudre
@ 2002-12-10 13:20 ` Damien Doligez
1 sibling, 0 replies; 10+ messages in thread
From: Damien Doligez @ 2002-12-10 13:20 UTC (permalink / raw)
To: caml-list
On Tuesday, Dec 10, 2002, at 03:01 Europe/Paris, Ken Rose wrote:
> type t = int let rec print_t = print_int
>
> Which the compiler rejects with "This kind of expression is not allowed
> as right-hand side of `let rec'" I haven't been able to figure out a
> way to sneak it past, either. What's going on here? Why can't I
> rename
> print_int?
The problem here is that you are using "let rec" to define a
non-functional value which is not recursive. O'Caml 3.06 can handle
some such definitions but not all of them. We have worked a bit on
the "let rec" restrictions and the current CVS version of O'Caml accepts
all non-recursive definitions in a let rec.
You have several solutions:
1. wait for the next release of O'Caml (no expected date yet)
2. use the CVS version (and be a beta-tester)
3. get rid of the "rec" in your generated code in the case where you
are only renaming a function
4. use eta-conversion to make it a functional value:
let rec print_t x = print_int x
-- Damien
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-12-10 12:25 ` Daniel de Rauglaudre
@ 2002-12-10 15:33 ` Ken Rose
2002-12-10 17:38 ` Daniel de Rauglaudre
0 siblings, 1 reply; 10+ messages in thread
From: Ken Rose @ 2002-12-10 15:33 UTC (permalink / raw)
To: Daniel de Rauglaudre; +Cc: caml-list
Hi,
I worded things badly enough that nobody understood what I was actually
after. What I want is help extending your automatically generated
printing functions to handle all the types I actually use.
Daniel de Rauglaudre wrote:
> On Mon, Dec 09, 2002 at 06:01:41PM -0800, Ken Rose wrote:
>
> > 1. Is there a clean way to handle (sum) types with constructors with
> > multiple module qualifications? I hacked the example to deal with
> > Foo.bar, but it doesn't seem to extend automatically to Foo.Bar.baz. As
> > I understand it, I'd need a new pattern for each additional uid.
>
> I don't understand that: in the type definition, there is no qualifications
> for the constructors.
This is for a type like:
type x = A of int * Foo.t * Bar.Baz.t
| ...
Where I don't want to have to put in
| <:ctyp< $uid:m$.$lid:s$ >> -> <:expr< $uid:m$.$lid:fun_name s$ >>
and
| <:ctyp< $uid:m2$.$uid:m$.$lid:s$ >> -> <:expr<
$uid:m2$.$uid:m$.$lid:fun_name s$ >>
and so on into gen_print_type. Or do I not understand what $uid:x$
does?
> > 2. How are tuples represented in camlp4's syntax? This is so I can
> > match them when analyzing a type.
>
> In Revised syntax, they are like in normal syntax, but the parentheses
> are compulsory.
Here, I want to match
type t = int * int
within gen_one_print_fun, to produce a printer instead of "failwith...".
> > 3. This is the big one. When working on a type like:
> > type t = int
> > with the obvious extention to Daniel's code, the preprocessor produces
> > type t = int let rec print_t = print_int
> > Which the compiler rejects with "This kind of expression is not allowed
> > as right-hand side of `let rec'" I haven't been able to figure out a
> > way to sneak it past, either. What's going on here? Why can't I rename
> > print_int?
>
> This message of OCaml just means that there are syntactic restrictions
> of the "let rec". In this case, you should produce either a "let" without
> "rec" or, an eta extension: "let rec print_t x = print_int x".
I'd suspected that, though I'm still curious as to why that's so.
Still, what I really want is a generally useful tool to produce these
useful functions, without having to spend too much time right now
learning camlp4. It's for my regular work, where I'm building a
compiler for a DSL. I don't understand camlp4 well enough to know how
to suppress the "rec", and I'm hoping to avoid learning, at least for a
while. It's a great tool, but I have only so much time.
Thanks for any help you're willing to give,
- ken
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Caml-list] Camlp4: generating printers of types
2002-12-10 15:33 ` Ken Rose
@ 2002-12-10 17:38 ` Daniel de Rauglaudre
0 siblings, 0 replies; 10+ messages in thread
From: Daniel de Rauglaudre @ 2002-12-10 17:38 UTC (permalink / raw)
To: caml-list
Hi,
On Tue, Dec 10, 2002 at 07:33:23AM -0800, Ken Rose wrote:
> and so on into gen_print_type. Or do I not understand what $uid:x$
> does?
If x is a string <:expr< $uid:x$ >> produces "the uppercase identifier
named by the value of x". If x is "Foo", this produces the identifier
Foo. Notice that it works even if x does not contain an uppercase
identifier: OCaml with interpret it as a module name or as a
constructor name (depending on its position), whatever its value.
Sorry, for your Baz.Baz.t, you need your <:ctyp< $uid:m2$.$uid:m$.$lid:s$ >>
The better is to use an iterator, or use the recursion to treat the
general case.
> > In Revised syntax, they are like in normal syntax, but the parentheses
> > are compulsory.
>
> Here, I want to match
> type t = int * int
> within gen_one_print_fun, to produce a printer instead of "failwith...".
In Normal syntax, you can write "int * int" but inside the predefined
quotations of AST, you have to use the Revised syntax. See the chapter
about it in the reference manual.
You must write it <:ctyp< (int * int) >>. And if tl is a list of ctyp,
you can obtain the type tuple of this list of types with:
<:ctyp< ($list:tl$) >>
See the chapter about AST quotations.
> > This message of OCaml just means that there are syntactic restrictions
> > of the "let rec". In this case, you should produce either a "let" without
> > "rec" or, an eta extension: "let rec print_t x = print_int x".
>
> I'd suspected that, though I'm still curious as to why that's so.
Damien Doligez answered you on that point; this is typing and
therefore not the work of Camlp4.
> Still, what I really want is a generally useful tool to produce these
> useful functions, without having to spend too much time right now
> learning camlp4. It's for my regular work, where I'm building a
> compiler for a DSL. I don't understand camlp4 well enough to know how
> to suppress the "rec", and I'm hoping to avoid learning, at least for a
> while. It's a great tool, but I have only so much time.
Well, if you don't have time to look at it, I can help.
--
Daniel de RAUGLAUDRE
http://cristal.inria.fr/~ddr/
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2002-12-10 17:38 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-09 13:13 [Caml-list] Camlp4: generating printers of types Daniel de Rauglaudre
2002-10-09 17:18 ` Markus Mottl
2002-10-25 19:20 ` Ken Rose
2002-10-25 20:02 ` Chris Hecker
2002-10-26 0:11 ` Daniel de Rauglaudre
2002-12-10 2:01 ` Ken Rose
2002-12-10 12:25 ` Daniel de Rauglaudre
2002-12-10 15:33 ` Ken Rose
2002-12-10 17:38 ` Daniel de Rauglaudre
2002-12-10 13:20 ` Damien Doligez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox