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