caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Virgile Prevosto <virgile.prevosto@lip6.fr>
To: Jim Farrand <jim@farrand.net>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Inline operators in the revised syntax
Date: Tue, 13 May 2003 17:23:34 +0200	[thread overview]
Message-ID: <20030513172334.29bae6ca.virgile.prevosto@lip6.fr> (raw)
In-Reply-To: <20030513122147.GA8982@farrand.net>

Le mardi 13 mai, à 13h21 CEST, Jim Farrand a écrit:

> Is there a simple way to define and use an inline operator in the revised
> syntax?  It seems they can be defined but not used.
> 
> The equivelent in the old syntax works fine.  (I realise it's probably
> possible to use camlp4's grammar extension features to do the same, but
> I don't know how to do this, and it seems like overkill when it was so
> easy in the old syntax.)

Unfortunately for you, the camlp4 manual suggests to use syntax extensions for
infix operators (http://caml.inria.fr/camlp4/manual/manual007.html)... 
But this doesn't mean that you have to write one syntax extension for
every infix operator you want to create: you may extend the syntax once with a
rule which will itself make the necessary extensions, such as the following
example:
---
(* file infix.ml4. compile it with
   ocamlc -c -pp 'camlp4o pa_extend.cmo q_MLast.cmo -impl' -I +camlp4 
   -impl infix.ml4

   usage: infix id x y = ... ; creates an infix operator.
*)
open Pcaml

if !Sys.interactive then print_endline "infix definitions";;
EXTEND str_item:
[ [ "infix"; p = LIDENT; argts = LIST0 LIDENT; "="; e=expr ->
      let def = List.fold_right (fun arg e -> <:expr< fun $lid:arg$ -> $e$>>)
                  argts e
      in 
        (* we create a new extension which recognizes the expression
           e1 'p' e2, where 'p' is our new operator. Unfortunately, the
        EXTEND ... END syntactic sugar cannot help here, since p would be 
        considered as an entry of the grammar and not as a new keyword*)
        Grammar.extend
          [Grammar.Entry.obj expr, Some (Gramext.Before "apply"),
           [None, None, 
            [[Gramext.Sself; Gramext.Stoken ("",p);Gramext.Sself],
             Gramext.action
               (fun e2  _ e1 loc  -> 
                  (MLast.ExApp 
                     (loc, MLast.ExApp (loc, <:expr< $lid:p$>>, e1), e2)))]]];
        (* definition of the operator itself. *)
        <:str_item< value $lid:p$ = $exp:def$ >>]];
END 
---- 
Note that this is far from being perfect, since for instance it does not 
allow you to give the type of the arguments of your operator. Anyway, it 
works on simple examples:
        Objective Caml version 3.06
# #load "camlp4r.cma";;
        Camlp4 Parsing version 3.06

# #load "infix.cmo";
infix definitions
# infix \=== x y = x = y;
value ( === ) : 'a -> 'a -> bool = <fun>
# \=== 1 1;
- : bool = True
# 1 === 1;
- : bool = True
# infix foo x y = x + y;
value foo : int -> int -> int = <fun>
# 1 foo 1;
- : int = 2
# \foo 1 1;
- : int = 2

Hope this helps,
-- 
E tutto per oggi, a la prossima volta
Virgile

-------------------
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


  reply	other threads:[~2003-05-13 15:23 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-13 12:21 Jim Farrand
2003-05-13 15:23 ` Virgile Prevosto [this message]
2003-05-15  9:07   ` Jim Farrand

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=20030513172334.29bae6ca.virgile.prevosto@lip6.fr \
    --to=virgile.prevosto@lip6.fr \
    --cc=caml-list@inria.fr \
    --cc=jim@farrand.net \
    /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).