Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Alain.Frisch@ens.fr
To: Richard Jones <rich@annexia.org>
Cc: Caml list <caml-list@inria.fr>
Subject: Re: [Caml-list] OCaml wishlist
Date: Tue, 21 Oct 2003 17:26:11 +0200 (MET DST)	[thread overview]
Message-ID: <Pine.SOL.4.44.0310211642370.12954-100000@clipper.ens.fr> (raw)
In-Reply-To: <20031021142921.GA6736@redhat.com>

On Tue, 21 Oct 2003, Richard Jones wrote:

> 1. 'return' from a function. eg:
>
>   let foo x =
>     if x < 0 then return "OSL";
>     (* long & complex code *)
>     return "some other string"
>
>   I know I can do this using if ... else, but when you have multiple
>   levels of if ... else you end up being indented so far across the
>   screen as to make coding unpleasant. This is particularly a concern
>   with writing basically imperative UI code.
>
>   Is it possible to do something like this with camlp4? (as a stopgap -
>   I still think it should go into the language)

With Camlp4 and the Obj module, yes, it should be possible, but
inefficient. I assume you want to be able to escape from loops,
so you have to use exceptions (if you don't want to escape from loops,
I guess you can avoid using exceptions, with a lot of extra option types).

You can use Camlp4 to expand

fun x -> ... (return e1) ... (return e2) ... e

(the return statements are not under abstractions)

to:

fun x -> (try ... (raise (Return (Obj.repr (e1 : 'a))))
              ... (raise (Return (Obj.repr (e1 : 'a))))
              ... e2
          with Return x -> Obj.magic x) : 'a

with a global definition:

exception Return of Obj.t

You need the 'a annotation to ensure type-safety (btw, would the above
version be correct in all cases?). Of course the 'a name should be unique
for the abstraction.

AFAIK, it is not possible to define in a syntax extension a local
exception (inside a "let module M = struct ... end in ...") with an
argument of the return type (which is unknown at preprocessing time,
and moreover it might be polymorphic).

Needless to say, this will be inefficient.

> 2. abstract data type syntactic sugar:

How does it interact with type inference?


Cheers,

 Alain

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


  parent reply	other threads:[~2003-10-21 19:18 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-21 14:29 Richard Jones
2003-10-21 14:55 ` Michal Moskal
2003-10-21 16:02   ` Richard Jones
2003-10-21 17:28   ` William Lovas
2003-10-21 17:50     ` Richard Jones
2003-10-21 20:27       ` Yaron Minsky
2003-10-21 20:32       ` Yaron Minsky
2003-10-21 21:46         ` Alain.Frisch
2003-10-22  0:59       ` Jacques Garrigue
2003-10-22  2:52         ` Brian Hurt
2003-10-22 15:27           ` Michal Moskal
2003-10-21 19:46     ` Alain.Frisch
2003-10-21 15:26 ` Alain.Frisch [this message]
2003-10-21 17:38 ` David Brown
2003-10-21 22:34 Richard Jones
2003-10-22  1:14 ` Jacques Garrigue
2003-10-22 13:21   ` brogoff
2003-10-23  0:31   ` Eray Ozkural
2003-10-23 16:55   ` skaller

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=Pine.SOL.4.44.0310211642370.12954-100000@clipper.ens.fr \
    --to=alain.frisch@ens.fr \
    --cc=caml-list@inria.fr \
    --cc=rich@annexia.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