Browse thread
lazy vs fun
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Martin Jambon <martin.jambon@e...> |
| Subject: | Re: [Caml-list] lazy vs fun |
Martin Jambon wrote:
> Stéphane Glondu wrote:
>> Warren Harris a écrit :
>>> Is there any advantage to using lazy evaluation in ocaml rather than
>>> just using thunks to defer evaluation? [...]
>> Two things I can think of right now: they are evaluated only once (even
>> if you call Lazy.force several times), and you can do pattern matching
>> with them.
>
>
> Note that the memoization feature can be implemented like this:
>
> let lz f =
> let result = ref `None in
> fun () ->
> match !result with
> `None ->
> (try
> let y = f () in
> result := `Result y;
> y
> with e ->
> result := `Exn e;
> raise e
> )
> | `Result y -> y
> | `Exn e -> raise e
Oops.
The following makes it possible for f to be garbage-collected:
let lz f =
let result = ref (`None f) in
fun () ->
match !result with
`None f ->
(try
let y = f () in
result := `Result y;
y
with e ->
result := `Exn e;
raise e
)
| `Result y -> y
| `Exn e -> raise e
Martin
--
http://mjambon.com/