From: brogoff@speakeasy.net
To: Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
Cc: "caml-list@inria.fr" <caml-list@inria.fr>
Subject: Re: [Caml-list] Python's yield, Lisp's call-cc or C's setjmp/longjmp in OCaml
Date: Wed, 17 Dec 2003 11:42:53 -0800 (PST) [thread overview]
Message-ID: <Pine.LNX.4.44.0312171121170.22390-100000@grace.speakeasy.net> (raw)
In-Reply-To: <87y8tbvii9.fsf@student.uni-tuebingen.de>
On 17 Dec 2003, Falk Hueffner wrote:
> ijtrotts@ucdavis.edu writes:
>
> > Why not do this:
> >
> > # let rec number() =
> > let i=ref(-1) in fun() ->
> > incr i;
> > !i, if !i mod 2 = 0 then "Even" else "Odd";;
> > val number : unit -> unit -> int * string = <fun>
> > # let n=number();;
> > val n : unit -> int * string = <fun>
> > # Array.init 10 (fun _ -> n());;
> > - : (int * string) array =
> > [|(0, "Even"); (1, "Odd"); (2, "Even"); (3, "Odd"); (4, "Even"); (5, "Odd");
> > (6, "Even"); (7, "Odd"); (8, "Even"); (9, "Odd")|]
>
> This only works for simple examples. Try for example writing a
> function which successively yields all possible moves for a chess
> board. The "yield" operator really helps there.
While I think yield is pretty cool, having used in Sather, which got in from CLU
I believe,you can simulate this control flow and more using higher order
functions. Sticking with the simple example, but ditching the array and rolling
my own streams with core ML yields (ha!)
type 'a generator = Nil | Cons of 'a * (unit -> 'a generator);;
let rec odd_even i j =
if i > j then
Nil
else
Cons(i, (fun () -> odd_even (succ i) j));;
let rec print_upto n = function
Nil -> ()
| Cons(i, f) ->
if i <= n then
let s = if i mod 2 = 0 then "EVEN" else "ODD" in
(Printf.printf "(%i, %s)\n" i s;
print_upto n (f()))
else
();;
which has similar semantics to the Python yield, except that the generator is
not consumed during the traversal. It should be obvious how to encode that
behavior by modifying print_upto to return the remaining generator.
In any case, programming this kind of thing in ML is pretty easy, so I don't
think we need an extension to the language for yield. callcc is more powerful,
but I don't like the possibility that making callcc fast penalizes code which
doesn't use it. We have exceptions and threads already.
-- Brian
-------------------
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
next prev parent reply other threads:[~2003-12-17 19:43 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-12-16 13:13 Nuutti Kotivuori
2003-12-16 13:28 ` Oleg Trott
2003-12-18 0:15 ` Nuutti Kotivuori
2003-12-16 13:48 ` Ville-Pertti Keinonen
2003-12-16 15:41 ` Kenneth Knowles
2003-12-16 16:45 ` Richard Jones
2003-12-16 18:36 ` Ville-Pertti Keinonen
2003-12-16 18:42 ` Brian Hurt
2003-12-16 18:10 ` Dustin Sallings
2003-12-17 6:30 ` ijtrotts
2003-12-17 8:13 ` Dustin Sallings
2003-12-17 10:35 ` Falk Hueffner
2003-12-17 19:14 ` Pierre Weis
2003-12-17 19:32 ` Falk Hueffner
2003-12-17 20:04 ` David Brown
2003-12-18 1:14 ` Nicolas Cannasse
2003-12-18 5:31 ` David Brown
2003-12-18 7:05 ` Brian Hurt
2003-12-18 6:45 ` David Brown
2003-12-18 18:44 ` brogoff
2003-12-17 19:42 ` brogoff [this message]
2003-12-19 13:39 ` skaller
2003-12-18 0:51 ` Nuutti Kotivuori
2003-12-16 18:06 Kevin S. Millikin
2003-12-18 22:08 Ker Lutyn
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.LNX.4.44.0312171121170.22390-100000@grace.speakeasy.net \
--to=brogoff@speakeasy.net \
--cc=caml-list@inria.fr \
--cc=falk.hueffner@student.uni-tuebingen.de \
/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