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: | Lauri Alanko <la@i...> |
| Subject: | Re: [Caml-list] Why do input* and readdir throw End_of_file ... annoying! |
On Fri, Jun 06, 2003 at 01:49:55PM -0500, Brian Hurt wrote:
> 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
This is a good argument for the alternative exception handling syntax
proposed by in "Exceptional syntax", JFP 11(4):395-410,
<http://research.microsoft.com/~nick/except.ps>. They suggest a form
try x <= e1 in e2 unless E => e3
which acts like "let x = e1 in e2" when e1 causes no exceptions, but
otherwise goes directly to the handler and skips e2 entirely.
So the function above could be written:
let rec read_all_lines chan accum =
try
line <= input_line chan
in
read_all_lines chan (line :: accum)
unless
End_of_file => List.rev accum
It looks almost the same, but here the scope of the handler does _not_
extend over the recursive call, only the binding
Actually, as pointed out by the article, this thing has been suggested
on caml-list before: <http://caml.inria.fr/archives/199912/msg00078.html>.
Lauri Alanko
la@iki.fi
-------------------
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