caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Inline operators in the revised syntax
@ 2003-05-13 12:21 Jim Farrand
  2003-05-13 15:23 ` Virgile Prevosto
  0 siblings, 1 reply; 3+ messages in thread
From: Jim Farrand @ 2003-05-13 12:21 UTC (permalink / raw)
  To: caml-list

Hi,

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.

Silly example:

> Objective Caml version 3.06

> Camlp4 Parsing version 3.06

> # value \=== a b = a=b ;
> value ( === ) : 'a -> 'a -> bool = <fun>
> # 1 === 1 ;
> Toplevel input:
> # 1 === 1 ;
>     ^^^
> Parse error: ';' expected after [str_item] (in [phrase])

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

As an aside, do many people actually use the revised syntax?

Kind regards,
Jim

-- 
Jim Farrand
-- 

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

* Re: [Caml-list] Inline operators in the revised syntax
  2003-05-13 12:21 [Caml-list] Inline operators in the revised syntax Jim Farrand
@ 2003-05-13 15:23 ` Virgile Prevosto
  2003-05-15  9:07   ` Jim Farrand
  0 siblings, 1 reply; 3+ messages in thread
From: Virgile Prevosto @ 2003-05-13 15:23 UTC (permalink / raw)
  To: Jim Farrand; +Cc: caml-list

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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Caml-list] Inline operators in the revised syntax
  2003-05-13 15:23 ` Virgile Prevosto
@ 2003-05-15  9:07   ` Jim Farrand
  0 siblings, 0 replies; 3+ messages in thread
From: Jim Farrand @ 2003-05-15  9:07 UTC (permalink / raw)
  To: Virgile Prevosto; +Cc: caml-list

On Tue, May 13, 2003 at 05:23:34PM +0200, Virgile Prevosto wrote:

> Unfortunately for you, the camlp4 manual suggests to use syntax extensions for
> infix operators (http://caml.inria.fr/camlp4/manual/manual007.html)... 

Ah, I did look in the manual, honest.  Somehow I missed this.

> (* file infix.ml4. compile it with
> Hope this helps,

It helps immensely.

Many thanks,
Jim

-- 
Jim Farrand
-- 

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

end of thread, other threads:[~2003-05-15  9:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-13 12:21 [Caml-list] Inline operators in the revised syntax Jim Farrand
2003-05-13 15:23 ` Virgile Prevosto
2003-05-15  9:07   ` Jim Farrand

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