my stupidity and non-tail calls

From: David Brown (caml-list@davidb.org)
Date: Wed Dec 15 1999 - 17:39:36 MET


Date: Wed, 15 Dec 1999 08:39:36 -0800 (PST)
To: Norman Ramsey <nr@eecs.harvard.edu>
Subject: my stupidity and non-tail calls
In-Reply-To: <199912141953.OAA04635@labrador.eecs.harvard.edu>
From: David Brown <caml-list@davidb.org>

Norman Ramsey writes:
> OK, I apologize for bothering everyone. My `tail calls' are actually
> sitting inside `try ... with' blocks, so I recognize that these cannot be
> optimized since they are in the scope of different handlers. I will
> have to find a way to restructure my code. A great pity, since
> I like it the way it is... suggestions are welcome.

I wonder if this is worthy of the FAQ. I have done the same thing as
well. It comes kind of as a consequence of ocaml's philosophy of
using exceptions for things such as not-found, and end of file. Doing
this cleans up a lot of code, and a few things get a little messier.

I don't know if there is a "clean" way to do it, but what I usually do
is wrap the item around an option.

e.g.
   let maybe_input_char infile =
     try
       Some (input_char infile)
     with End_of_file ->
       None
   
   then in the code...
   
      let next' = maybe_input_char infile in
      match next' with
        Some next ->
          let () = Queue.add next q in
          ...
          compressLoop instr' b q csum infile
      | None ->
          finishCompressing instr' b q

It isn't quite as clean as the exception code, but it is
tail-recursive.

David Brown



This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:29 MET