caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Why do input* and readdir throw End_of_file ... annoying!
@ 2003-06-06 17:01 Richard Jones
  2003-06-06 17:30 ` Michal Moskal
  2003-06-06 18:03 ` Ville-Pertti Keinonen
  0 siblings, 2 replies; 14+ messages in thread
From: Richard Jones @ 2003-06-06 17:01 UTC (permalink / raw)
  To: caml-list

Dear OCaml users,

I'm pretty convinced that having the input* functions and readdir
throw End_of_file when they run out of data is wrong. Instead
'readdir' (for example) should be prototyped as:

readdir : dir_handle -> string option

and the functions should return None when they run out of data.
Either that or alternative forms which don't throw exceptions should
be available.

The reason is it makes input* and readdir very hard to use since they
are throwing exceptions in what is essentially an un-exceptional case
(it's _normal_, not exceptional, to keep reading data until the end of
the stream).

Take a look at the attached code. I've wrapped up 'readdir' in a
function which hides the annoying exception (or course, this is
inefficient, but I don't have much choice). The code is reasonably
easy to understand. Please someone show me the elegant solution to
this problem which doesn't involve hiding the exception ...

An alternative would be, like Perl, to provide alternative forms
of input_line and readdir (in particular) which return a list of
lines/names in a single go, rather like:

  my @files = readdir DIR;

in Perl.

(Another minor point - do I need to call closedir, or will the garbage
collector do that for me?)

Rich.

----------------------------------------------------------------------
open Unix

type filesystem = File of string | Directory of filesystem list;;

let readdir_no_ex dirh =
  try
    Some (readdir dirh)
  with
    End_of_file -> None
  ;;

let rec read_directory path =
  let dirh = opendir path in
  let rec loop () =
    let filename = readdir_no_ex dirh in
    match filename with
      None -> []
    | Some "." -> loop ()
    | Some ".." -> loop ()
    | Some filename ->
	let pathname = path ^ "/" ^ filename in
	let stat = lstat pathname in
	let this = if stat.st_kind = S_DIR then
	  Directory (read_directory pathname)
	else
	  File pathname in
	this :: loop ()
  in
  loop ()
  ;;

let path = Sys.argv.(1);;
let fs = read_directory path;;


-- 
Richard Jones, Red Hat Inc. (London) and Merjis Ltd. http://www.merjis.com/
http://www.annexia.org/ Freshmeat projects: http://freshmeat.net/users/rwmj
NET::FTPSERVER is a full-featured, secure, configurable, database-backed
FTP server written in Perl: http://www.annexia.org/freeware/netftpserver/

-------------------
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


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2003-06-09 15:15 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-06-06 17:01 [Caml-list] Why do input* and readdir throw End_of_file ... annoying! 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
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

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).