Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Re: Revised syntax question
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2000-09-27 (07:29)
From: Daniel de Rauglaudre <daniel.de_rauglaudre@i...>
Subject: Re: Revised syntax question

On Tue, Sep 26, 2000 at 04:58:33PM +0200, Gerard Huet wrote:

> I hate this return, and actually I do not like this dangling e4.

I don't know what you have against the do...return construct, since we
are in a functional language and this kind of construction separates the
imperative part (do...return) which could (should) be typed "unit" and
the functional part (after the return). My opinion is that in "e1;e2;..;en"
the expression "en" has something different.

I don't agree with the idea that some control is passed from e1 to e2, then
e2 to e3. In sequence, we do "e1", then we forget it, we do e2, we forget it,
and nothing at all runs from e1 to e2.

And if your sequence is only composed of side effects, "en" included,
you can write (it's what I do):
    do e1;e2;..;en; return ()

which appears to me very logical. Just consider "return ()" as the
ending keyword.


But... but! I don't want to make a business with that. We can talk about
it, but I agree to change that into a completely symmetrical form like the
one you propose if we are numerous enough to accept that form. Besides, there
is the problem of the "let" inside sequences which my form does not allow.

(Explanation: when you write in OCaml syntax:
      e1; e2; let x1 = f1 in e3; e4
actually, this sequence has 3 (not 4) expressions:
      e1; e2; (let x1 = f1 in e3; e4)
since the binding x1 = f1 runs up to e4; in my syntax you have to write:
      do e1; e2; return let x1 = f1 in do e3; return e4
and I recognize it is ugly.)


What about Michel Mauny's proposition for the sequence:
    do { e1; e2; ... ; en }

The braces remind C language, what is logical, since it is imperative.
The "let" up to the end of the sequence could be represented by "let
binding ;", i.e. ended by just a semicolon instead of "in":
    do { e1; e2; let x1 = f1; e3; e4 }

what would remind the "x1 = f1;" of C.

The while and for constructs could be changed into:

     while e do { e1; ....; en }
     for x = e1 to e2 do { e1; ...; en }

with the same ability to write this "let x = y;"

I can implement that if there are several persons who like it,
because, for the moment, I am used to "do...return ()" in my code, I
wrote a lot of code with it and I don't want to change it if three
days after, people tells me it is uglier.

I can also change my syntax tree to that form and accept
     <:expr< do { e1; ... ; en } >>
as sequence syntax tree.

I consider simple parentheses as not enough "sequence". When a
parenthesis is opened, if the expression is long, there is no way to
know whether it is a sequence or not. There is the same problem with
t-uples but generally, t-uples are shorter than sequences. I consider
that the language should clearly show sequences, even with a loss of