caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] type problem with camlp4
@ 2003-01-07  3:57 Pietro Abate
  2003-01-07 12:39 ` Daniel de Rauglaudre
  0 siblings, 1 reply; 4+ messages in thread
From: Pietro Abate @ 2003-01-07  3:57 UTC (permalink / raw)
  To: caml-list

hi folks,

I have a problem expanding an <:expr<>> quotation.
the code snippet below raise this error
ocamlc -c -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I
/usr/lib/ocaml/camlp4 test.ml
File "test.ml", line 19, characters 13-42:
This expression has type MLast.patt * ff but is here used with type
  MLast.patt * MLast.expr
  
how can I write the variable 'content' in the preprocessor step ?

It should be written down just like a string... is there any generic way 
to achive the same as I do with <:expr<$str:"ddd">> for strings with any
datatype ?

Of course immagine that the variable 'a' came from a more complex
function like a parser...

tnx,
p

---------
(*pp camlp4o pa_extend.cmo q_MLast.cmo *)

open Pcaml;;

type ff = 
    | A1
    | A2

let el = Grammar.Entry.create gram "el";;
EXTEND
    expr:
        [[ "test"; n = LIST1 el SEP ";" ->
            <:expr< let $list:n$ in 1 >>
        ]];
    el:
        [[ n = LIDENT ->
            let a = A1 in  (* <---- the problem is here!!! *)
            (<:patt<$lid:n$>>,<:expr<$a$>>) ]];
END

------
let a = test b ;;



-------------------
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] 4+ messages in thread

* Re: [Caml-list] type problem with camlp4
  2003-01-07  3:57 [Caml-list] type problem with camlp4 Pietro Abate
@ 2003-01-07 12:39 ` Daniel de Rauglaudre
  2003-01-07 22:34   ` Pietro Abate
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel de Rauglaudre @ 2003-01-07 12:39 UTC (permalink / raw)
  To: caml-list

Hi,

On Tue, Jan 07, 2003 at 02:57:10PM +1100, Pietro Abate wrote:

> I have a problem expanding an <:expr<>> quotation.
> the code snippet below raise this error
> ocamlc -c -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I
> /usr/lib/ocaml/camlp4 test.ml
> File "test.ml", line 19, characters 13-42:
> This expression has type MLast.patt * ff but is here used with type
>   MLast.patt * MLast.expr

You seem to mistake the "compiler" level and the "program" level. In
the "compiler" (Camlp4) level, you need not define your type "ff" and
its constructors A1 and A2: they belong actually to the "program"
level. I mean: they need to be defined only in the files using your
syntax extension test.cmo (compiled by camlp4o ./test.cmo ...)

In the syntax tree, they cannot appear as things of type "tt" since
Camlp4 cannot know all possible defined types. At this level, your
constructor is just "syntax tree of a constructor" and the constructor
name is just a string.

The good method is:

>     el:
>         [[ n = LIDENT ->
>             let a = <:expr< A1 >> in
>             (<:patt<$lid:n$>>,<:expr<$a$>>) ]];

or:

>     el:
>         [[ n = LIDENT ->
>             (<:patt<$lid:n$>>,<:expr< A1 >>) ]];

or:

>     el:
>         [[ n = LIDENT ->
>             let a = "A1" in
>             (<:patt<$lid:n$>>,<:expr<$uid:a$>>) ]];

-- 
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] 4+ messages in thread

* Re: [Caml-list] type problem with camlp4
  2003-01-07 12:39 ` Daniel de Rauglaudre
@ 2003-01-07 22:34   ` Pietro Abate
  2003-01-08  2:31     ` Daniel de Rauglaudre
  0 siblings, 1 reply; 4+ messages in thread
From: Pietro Abate @ 2003-01-07 22:34 UTC (permalink / raw)
  To: caml-list

On Tue, Jan 07, 2003 at 01:39:47PM +0100, Daniel de Rauglaudre wrote:
> In the syntax tree, they cannot appear as things of type "tt" since
> Camlp4 cannot know all possible defined types. At this level, your
> constructor is just "syntax tree of a constructor" and the constructor
> name is just a string.

ok, I got the problem. The next question is: can I extract the string 
rappresenting a variable from a variable ?

in my example I would like to generate a piece of code with a datatype
(ff) that is the parsing result of the string n.

for example, if n = " a + b " I would like to generate a piece of code
like Add (a,b), where Add is part of the datastructure:
type ff =
    | A1
    | A2
    | Add of int * int

and this DS will be visible from both the program and the preprocessor.

el:
	[[ n = STRING ->
		let node = magic_function ( parse_string n ) in
		let id = gen_id() in
		(<:patt<$lid:id$>>,<:expr<$node$>>)
	]];

who can I do that ? what is the magic function ?

tnx,
p
-------------------
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] 4+ messages in thread

* Re: [Caml-list] type problem with camlp4
  2003-01-07 22:34   ` Pietro Abate
@ 2003-01-08  2:31     ` Daniel de Rauglaudre
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel de Rauglaudre @ 2003-01-08  2:31 UTC (permalink / raw)
  To: caml-list

Hi,

On Wed, Jan 08, 2003 at 09:34:55AM +1100, Pietro Abate wrote:

> 	[[ n = STRING ->
> 		let node = magic_function ( parse_string n ) in
> 		let id = gen_id() in
> 		(<:patt<$lid:id$>>,<:expr<$node$>>)
> 	]];
> 
> who can I do that ? what is the magic function ?

let node = Grammar.Entry.parse Pcaml.expr (Stream.of_string n) in

You may need to enclose that with a good "try..with" in case of syntax
error in your string, because the error location raised would be relative
to it, and would highlight a wrong position. Moreover, the resulting
tree should be also re-located in case of semantic error for the
same reason.

Actually, it should be like the handling of quotations, but with that
above function as expander. But the code doing that in Camlp4 is in
several parts and may not be so easy to extract if you don't know the
internal code of Camlp4. I can do it if you want and possibly add a
new function in Camlp4 (module Pcaml) for that kind of usage.

-- 
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] 4+ messages in thread

end of thread, other threads:[~2003-01-08  2:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-07  3:57 [Caml-list] type problem with camlp4 Pietro Abate
2003-01-07 12:39 ` Daniel de Rauglaudre
2003-01-07 22:34   ` Pietro Abate
2003-01-08  2:31     ` Daniel de Rauglaudre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).