From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=AWL autolearn=disabled version=3.1.3 X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id D6081BC69 for ; Sun, 18 Feb 2007 01:44:26 +0100 (CET) Received: from ptb-relay03.plus.net (ptb-relay03.plus.net [212.159.14.214]) by concorde.inria.fr (8.13.6/8.13.6) with ESMTP id l1I0iP1w018941 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 18 Feb 2007 01:44:26 +0100 Received: from [80.229.56.224] (helo=beast.local) by ptb-relay03.plus.net with esmtp (Exim) id 1HIaAD-0005Yk-H3 for caml-list@yquem.inria.fr; Sun, 18 Feb 2007 00:44:25 +0000 From: Jon Harrop Organization: Flying Frog Consultancy Ltd. To: caml-list@yquem.inria.fr Subject: Re: [Caml-list] Question about try.. with Date: Sun, 18 Feb 2007 00:37:54 +0000 User-Agent: KMail/1.9.5 References: <45D79283.8000101@in.tum.de> In-Reply-To: <45D79283.8000101@in.tum.de> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200702180037.55160.jon@ffconsultancy.com> X-Miltered: at concorde with ID 45D7A169.001 by Joe's j-chkmail (http://j-chkmail . ensmp . fr)! X-Spam: no; 0.00; infile:01 infile:01 stdlib:01 stack:01 recursion:01 stack:01 exn:01 exn:01 endline:01 ocaml:01 ocaml:01 frog:98 beginners:01 wrote:01 faq:01 On Saturday 17 February 2007 23:40, christian konrad wrote: > Hello list, > > I'm doing that: > > let _ = > try > let infile = open_in !filename in > let rec readIn () = > try > (input_line infile) ^ readIn(); > with ee -> ""; > in > print_string(readIn () ); > "good"; > with e -> "";; > > So why don't I get any output at all? Doesn't "with" erease the raised > Exception? You may get better/faster responses to this kind of question on the beginners list. Reading a file is a FAQ and the stdlib does little to help. In this case, your code is probably stack overflowing due to too much recursion, raising the Stack_overflow exception which is then caught and the empty string returned. To circumvent this problem (and the fact that repeated string concatenation is slow) you should write that function in the following style: (* Boxed input_line *) let try_input_line ch = try Some(input_line ch) with End_of_file -> None;; (* Left fold over lines in a file. *) let rec fold_lines f accu ch = match try_input_line ch with | None -> accu | Some string -> fold_lines f (f accu string) ch;; (* Ensure that something is done after completion, whether or not an exception was raised. *) let finally f x g y = try let f_x = f x in g y; f_x with exn -> g y; raise exn;; (* Apply a function "k" to a file, ensuring that the file gets closed *) let read file k = let ch = open_in file in finally k ch close_in ch;; (* Read the lines of a file. *) let _ = let lines = List.rev (read file (fold_lines (fun t h -> h::t) [])) in let file = String.concat "\n" lines in print_endline file;; -- Dr Jon D Harrop, Flying Frog Consultancy Ltd. OCaml for Scientists http://www.ffconsultancy.com/products/ocaml_for_scientists