Version française
Home     About     Download     Resources     Contact us    
Browse thread
[Caml-list] Reading from a stream until '\000' - will this approach work?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Alessandro Baretta <alex@b...>
Subject: Re: [Caml-list] Reading from a stream until '\000' - will this approach work?


Richard wrote:
> After thinking a bit more about it...
> How about -
> 
> let rec myStreamReader inchan =
>    let char = read_char inchan in
>    if char = '\000' then
>       let holderString = holderString ^ char
>       and break
>    else
>       myStreamReader inchan
> ;;

The approach is somewhat buggy, but it can be fixed. Apart 
from a few syntactic issues, the main semantic bug is in the 
declaration of the holderstring value withing a function 
declaration. The value identified by holderstring is local 
to each function call, so you would simply be allocating a 
slew of single-character strings on the heap, which is not 
what you want. Besides, another crucial bug is that 
myStreamReader returns a unit-type value, which is meaningless.

This is how you can do it:

let global_EOL = ref '\000'
let myStreamReader = (* Notice this is not a func. decl. *)
   let holder = Buffer.create 0 in
   let rec read ?(reset_buffer=false) in_ch =
     if reset_buffer then Buffer.reset holder else ();
     let char = input_char in_ch in
     if char = !global_EOL
     then Buffer.contents holder
     else begin
       Buffer.add_char holder char;
       read ~reset_buffer:false in_ch
     end
    in read ~reset_buffer:true
;;

You can drag-n-drop this into your toplevel to test it.

At any rate, you should realize that this is a low-level, 
procedural solution. If you approach O'Caml you should 
attempt to learn the "Right Way(TM)" of programming: the 
functional way. Read the documentation of the Scanf module 
and learn to use that. You'll save yourself a lot of trouble 
with Buffer management, and I'm ready to be a whole dime 
that it's going to be a lot more efficient, too.

> Again - I hope I'm able to make sense...

You should test your code with the toplevel before 
submitting it to the list, insofar as possible.

> Thanks for any feedback on the concept!
> -Richard

Have a lot of *fun*!

Alex

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