Browse thread
[Caml-list] Why do input* and readdir throw End_of_file ... annoying!
[
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: | Brian Hurt <brian.hurt@q...> |
| Subject: | Re: [Caml-list] Why do input* and readdir throw End_of_file ... annoying! |
On Fri, 6 Jun 2003, Ville-Pertti Keinonen wrote:
> Since exceptions are reasonably inexpensive in O'Caml, and used for
> things such as Not_found in basic collection types, using exceptions to
> indicate the end of some particular set of values seems reasonable, to
> me.
>
> Writing a try ... with statement isn't really that different from a
> match statement except for the fact that you can handle exceptional
> circumstances generated by several expressions in the with ... part of
> a try ... with statement - if anything, that's more permissive.
>
The problem with try/with is that it's way to easy to break tail recursion
using try/with. About every other week someone comes to the Ocaml
beginners list where they are doing something like:
let rec read_all_lines chan accum =
try
let line = input_line chan in
read_all_lines chan (line :: accum)
with
End_of_file -> List.rev accum
Unfortunately, this is *not* tail recursive. Works fine on small files,
but when they try to run it on large files they stack overflow. Which
means you need to contort to take the recursion out of the try/with block.
Several different approaches to this are possible- but none with the
obviousness of the above code.
Personally, I'd like the following to be an efficient way to read all the
lines from a file into a list:
let rec read_all_lines chan =
try
let line = input_line chan in
line :: (read_all_lines chan)
with
End_of_file -> []
and have the compiler contort the code into an efficient, tail-recursive
form, with a combination of data structures with a hole and catch removal.
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