From: Norman Ramsey <nr@eecs.harvard.edu>
To: caml-list@inria.fr
Subject: my stupidity and non-tail calls
Date: Tue, 14 Dec 1999 14:53:18 -0500 [thread overview]
Message-ID: <199912141953.OAA04635@labrador.eecs.harvard.edu> (raw)
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.
For those who wished to see the offending code, I append it, or you
can visit http://www.eecs.harvard.edu/~nr/rsync.html.
Norman
let compress {size=size; blocks=blocks} infile =
let blocktab = mkBlockTable blocks in
let roll = Checksum.roll size in
let rec compressLoop instr' b q csum infile =
try (* first case: hit in the block table *)
match BTab.find_all blocktab csum
with [] -> raise Not_found
| candidates ->
let contents = Buffer.create size in
let () = Queue.iter (Buffer.add_char contents) q in
let fp = Fingerprint.string (Buffer.contents contents) in
let (blockNum, _) = List.find (fun (_, fp') -> fp = fp') candidates in
let instr' =
if Buffer.length b > 0 then STRING (Buffer.contents b) :: instr'
else instr' in
let instr' = BLOCK_NUMBERED blockNum :: instr' in
( Buffer.reset b
; Queue.clear q
; startCompressing instr' b q infile
)
with Not_found ->
try
let next = input_char infile in
let () = Queue.add next q in
let prev = Queue.take q in
let () = Buffer.add_char b prev in
let csum = roll csum prev next in
compressLoop instr' b q csum infile
(*********** not really a tail call ******)
with End_of_file ->
finishCompressing instr' b q
and finishCompressing instr' b q =
let () = Queue.iter (Buffer.add_char b) q in
List.rev (STRING (Buffer.contents b) :: instr')
and startCompressing instr' b q infile =
let rec fillAndSum csum k =
if k = 0 then csum
else
let c = input_char infile in
( Queue.add c q
; fillAndSum (Checksum.append csum c) (k-1)
) in
try
compressLoop instr' b q (fillAndSum (Checksum.string "") size) infile
with End_of_file ->
finishCompressing instr' b q in
next reply other threads:[~1999-12-15 9:49 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-12-14 19:53 Norman Ramsey [this message]
1999-12-15 10:04 ` Daniel de Rauglaudre
1999-12-16 7:45 ` A common use of try ... with Judicael Courant
1999-12-16 10:43 ` Daniel de Rauglaudre
1999-12-16 11:56 ` Christophe Raffalli
1999-12-15 16:39 ` my stupidity and non-tail calls David Brown
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=199912141953.OAA04635@labrador.eecs.harvard.edu \
--to=nr@eecs.harvard.edu \
--cc=caml-list@inria.fr \
/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