caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: "Nicolas Pouillard" <nicolas.pouillard@gmail.com>
To: "Caml List" <caml-list@inria.fr>, "Aleksey Nogin" <nogin@metaprl.org>
Subject: Re: [Caml-list] 3.10+beta: Camlp4: AST mapping treats record labels as patterns; should they have type ident instead?
Date: Wed, 18 Apr 2007 10:11:52 +0200	[thread overview]
Message-ID: <cd67f63a0704180111m6fa1a7fx8f21c322d583b710@mail.gmail.com> (raw)
In-Reply-To: <462508EC.2090302@metaprl.org>

On 4/17/07, Aleksey Nogin <nogin@metaprl.org> wrote:
> Currently Camlp4 AST defines the record patterns as
>
>    PaRec of loc and list (patt * patt)
>
> and record expressions as
>
>    ExRec of Loc.t and binding and expr

Why do you mix the old definition of PaRec with the new definition of ExRec.

I recall them:

Before:

  | PaRec of loc and list (patt * patt)

  | ExRec of loc and list (patt * expr) and option expr

Now:

    (* { p } *)
    | PaRec of Loc.t and patt

    (* { b } or { (e) with b } *)
    | ExRec of Loc.t and binding and expr

To fully understand here is a fragment of pattern and binding grammars:

patterns, p ::= ... | { p } | p1 = p2 | p1 ; p2

bindings, b ::= ... | p = e | b ; b

> where the binding can bind arbitrary patterns to expressions. This was
> not a big issue prior to 3.10, but now that 3.10 provides very powerful
> mapping and folding features, this seems a bit problematic. Namely, if I
> define a Camlp4 filter or an AST mapping function that affects patterns,
> the array labels will get affected as well, often in an undesired way.

It's undesired, but there is an easy workaround:

....
method patt p =
  match p with
  | ...
  | <:patt@loc< $p1$ = $p2$ >> -> <:patt@loc< $p1$ = $super#patt p2$ >>
  | ...
....


> Would it be better to have
>    PaRec of loc and list (ident * patt)
> and
>    ExRec of loc and list (ident * expr) and expr
> instead?

There is no more lists in the camlp4 AST, that's a price to pay to
have consistency w.r.t quotations.

For patterns there is something doable:

    | PaEq  of Loc.t and patt and patt (* p = p *)
Can become
    | PaEq  of Loc.t and ident and patt (* i = p *)

Since that node is only used with an ident on his left.

For expressions it's more complex, I won't do it.

Regards,

-- 
Nicolas Pouillard


  reply	other threads:[~2007-04-18  8:11 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-04-17 17:50 Aleksey Nogin
2007-04-18  8:11 ` Nicolas Pouillard [this message]
2007-04-18 16:13   ` [Caml-list] " Aleksey Nogin
2007-04-20 15:17     ` Nicolas Pouillard
2007-05-03  9:16       ` Nicolas Pouillard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cd67f63a0704180111m6fa1a7fx8f21c322d583b710@mail.gmail.com \
    --to=nicolas.pouillard@gmail.com \
    --cc=caml-list@inria.fr \
    --cc=nogin@metaprl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).