caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Brian Hurt <brian.hurt@qlogic.com>
To: Ville-Pertti Keinonen <will@exomi.com>
Cc: Richard Jones <rich@annexia.org>, <caml-list@inria.fr>
Subject: Re: [Caml-list] Why do input* and readdir throw End_of_file ... annoying!
Date: Fri, 6 Jun 2003 13:49:55 -0500 (CDT)	[thread overview]
Message-ID: <Pine.LNX.4.33.0306061337010.2857-100000@eagle.ancor.com> (raw)
In-Reply-To: <32CAF7EC-9849-11D7-BAD2-000393863F70@exomi.com>

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


  parent reply	other threads:[~2003-06-06 18:32 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-06-06 17:01 Richard Jones
2003-06-06 17:30 ` Michal Moskal
2003-06-06 18:03 ` Ville-Pertti Keinonen
2003-06-06 18:43   ` Richard Jones
2003-06-07 15:08     ` Eric C. Cooper
2003-06-07 20:27       ` David Brown
2003-06-07 21:46         ` art yerkes
2003-06-09 15:33         ` Brian Hurt
2003-06-09  9:31       ` Fabrice Le Fessant
2003-06-06 18:49   ` Brian Hurt [this message]
2003-06-06 18:51     ` Richard Jones
2003-06-06 19:09       ` [Caml-list] " Alan Post
2003-06-06 19:44       ` [Caml-list] " Brian Hurt
2003-06-06 23:08     ` Lauri Alanko

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.33.0306061337010.2857-100000@eagle.ancor.com \
    --to=brian.hurt@qlogic.com \
    --cc=caml-list@inria.fr \
    --cc=rich@annexia.org \
    --cc=will@exomi.com \
    /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;
as well as URLs for NNTP newsgroup(s).