caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Reading from a stream until '\000' - will this approach work?
@ 2002-09-13 18:25 Richard
  2002-09-15 17:28 ` Alessandro Baretta
  0 siblings, 1 reply; 2+ messages in thread
From: Richard @ 2002-09-13 18:25 UTC (permalink / raw)
  To: caml-list

After thinking a bit more about it...

(* Please read disclaimer comments first :)  *)

How about -

(*I'm not sure what the name of the method to read in just one 
character is... 'read_char' ??*)
(*I'm also not sure how to tack that character from the stream onto an 
ever growing string... '^' ?? *)
(*I still need to read about how to break out of a loop... 'break' ??*)

let rec myStreamReader inchan =
   let char = read_char inchan in
   if char = '\000' then
      let holderString = holderString ^ char
      and break
   else
      myStreamReader inchan
;;

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

Thanks for any feedback on the concept!
-Richard
-------------------
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] 2+ messages in thread

* Re: [Caml-list] Reading from a stream until '\000' - will this approach work?
  2002-09-13 18:25 [Caml-list] Reading from a stream until '\000' - will this approach work? Richard
@ 2002-09-15 17:28 ` Alessandro Baretta
  0 siblings, 0 replies; 2+ messages in thread
From: Alessandro Baretta @ 2002-09-15 17:28 UTC (permalink / raw)
  To: Richard, Ocaml



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


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

end of thread, other threads:[~2002-09-15 17:19 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-09-13 18:25 [Caml-list] Reading from a stream until '\000' - will this approach work? Richard
2002-09-15 17:28 ` Alessandro Baretta

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