* [Caml-list] string buffer as (in|out)_channel
@ 2003-07-17 7:05 Chris Hecker
2003-07-17 7:39 ` Yaron M. Minsky
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Chris Hecker @ 2003-07-17 7:05 UTC (permalink / raw)
To: caml-list
Is there any way to do something similar to the C++ string stream stuff,
where you treat strings (or Buffer.t's) as in_ or out_channels? The Format
module has a formatter for strings, but there doesn't seem to be a way to
do it with Pervasives. Something like:
val out_channel_of_buffer : Buffer.t -> out_channel
val in_channel_of_buffer : Buffer.t -> in_channel
and maybe _of_string versions too (probably necessary because you can't
convert a string to a buffer for the in_channel), which fill up and don't
expand.
It'd be very useful to be able to do this.
Thanks,
Chris
PS. Please cc me on replies, I temporarily unsubscribed from the list, thanks!
-------------------
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] 4+ messages in thread
* Re: [Caml-list] string buffer as (in|out)_channel
2003-07-17 7:05 [Caml-list] string buffer as (in|out)_channel Chris Hecker
@ 2003-07-17 7:39 ` Yaron M. Minsky
2003-07-18 9:13 ` Issac Trotts
2003-07-18 9:40 ` Issac Trotts
2 siblings, 0 replies; 4+ messages in thread
From: Yaron M. Minsky @ 2003-07-17 7:39 UTC (permalink / raw)
To: Chris Hecker; +Cc: Caml List
I think this is the kind of place where it would make sense to use the
object system. That is, in addition to the low-level in_channel and
out_channel, which essentially serve as proxies for unix file-descriptor
based channels, there should be I/O objects with a standard signature
for files, strings, buffers, etc. I actually have done a simple version
of this for myself as part of the SKS project, but I think something
along these lines would be useful as a standard part of ocaml, including
integration with printf and other places in the standard library that
use I/O.
As for your precise question, I don't myself know of any way to convert
a Buffer.t to an i/o channel.
y
On Thu, 2003-07-17 at 03:05, Chris Hecker wrote:
> Is there any way to do something similar to the C++ string stream stuff,
> where you treat strings (or Buffer.t's) as in_ or out_channels? The Format
> module has a formatter for strings, but there doesn't seem to be a way to
> do it with Pervasives. Something like:
>
> val out_channel_of_buffer : Buffer.t -> out_channel
> val in_channel_of_buffer : Buffer.t -> in_channel
>
> and maybe _of_string versions too (probably necessary because you can't
> convert a string to a buffer for the in_channel), which fill up and don't
> expand.
>
> It'd be very useful to be able to do this.
>
> Thanks,
> Chris
>
> PS. Please cc me on replies, I temporarily unsubscribed from the list, thanks!
>
> -------------------
> 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
--
|--------/ Yaron M. Minsky \--------|
|--------\ http://www.cs.cornell.edu/home/yminsky/ /--------|
Open PGP --- KeyID B1FFD916 (new key as of Dec 4th)
Fingerprint: 5BF6 83E1 0CE3 1043 95D8 F8D5 9F12 B3A9 B1FF D916
-------------------
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] 4+ messages in thread
* Re: [Caml-list] string buffer as (in|out)_channel
2003-07-17 7:05 [Caml-list] string buffer as (in|out)_channel Chris Hecker
2003-07-17 7:39 ` Yaron M. Minsky
@ 2003-07-18 9:13 ` Issac Trotts
2003-07-18 9:40 ` Issac Trotts
2 siblings, 0 replies; 4+ messages in thread
From: Issac Trotts @ 2003-07-18 9:13 UTC (permalink / raw)
To: caml-list; +Cc: Chris Hecker
Chris Hecker wrote:
>
> Is there any way to do something similar to the C++ string stream
> stuff, where you treat strings (or Buffer.t's) as in_ or
> out_channels? The Format module has a formatter for strings, but
> there doesn't seem to be a way to do it with Pervasives. Something like:
>
> val out_channel_of_buffer : Buffer.t -> out_channel
> val in_channel_of_buffer : Buffer.t -> in_channel
>
> and maybe _of_string versions too (probably necessary because you
> can't convert a string to a buffer for the in_channel), which fill up
> and don't expand.
>
> It'd be very useful to be able to do this.
For reading, this might do what you want:
(* wrap a Buffer with a Stream, for reading *)
let stream_of_buffer buf =
Stream.of_string(Buffer.contents buf)
;;
For writing, I guess this sort of thing would do it:
module Ostream :
sig
type t = char -> unit
val of_buffer : Buffer.t -> t
val of_string : string -> t
val of_out_channel : out_channel -> t
val output_string : t -> string -> unit
val output_value : t -> 'a -> unit
end
=
struct
type t = char -> unit
let of_buffer (buf:Buffer.t) : t =
fun (c:char) -> Buffer.add_char buf c
let of_string (s:string) : t =
let i = ref 0 in
fun (c:char) -> s.[!i] <- c
let of_out_channel (chan:out_channel) : t =
fun (c:char) -> output_char chan c
let output_string (ostream:t) (str:string) =
String.iter ostream str
let output_value (ostream:t) thing =
let str = Marshal.to_string thing [] in
output_string ostream str
end
Maybe it would be prettier to make a matching Istream module,
but I guess it's better to stay with the well-established Stream module.
Issac
>
>
> Thanks,
> Chris
>
> PS. Please cc me on replies, I temporarily unsubscribed from the
> list, thanks!
>
> -------------------
> 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
>
>
-------------------
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] 4+ messages in thread
* Re: [Caml-list] string buffer as (in|out)_channel
2003-07-17 7:05 [Caml-list] string buffer as (in|out)_channel Chris Hecker
2003-07-17 7:39 ` Yaron M. Minsky
2003-07-18 9:13 ` Issac Trotts
@ 2003-07-18 9:40 ` Issac Trotts
2 siblings, 0 replies; 4+ messages in thread
From: Issac Trotts @ 2003-07-18 9:40 UTC (permalink / raw)
To: caml-list; +Cc: Chris Hecker
Chris Hecker wrote:
>
> Is there any way to do something similar to the C++ string stream
> stuff, where you treat strings (or Buffer.t's) as in_ or
> out_channels? The Format module has a formatter for strings, but
> there doesn't seem to be a way to do it with Pervasives. Something like:
>
> val out_channel_of_buffer : Buffer.t -> out_channel
> val in_channel_of_buffer : Buffer.t -> in_channel
>
> and maybe _of_string versions too (probably necessary because you
> can't convert a string to a buffer for the in_channel), which fill up
> and don't expand.
>
> It'd be very useful to be able to do this.
Please disregard the previous buggy message I sent out. Here's a
fixed-up version:
(* read from a Buffer via a Stream *)
let stream_of_buffer buf =
Stream.from
(fun i ->
let s = Buffer.contents buf in
if i >= String.length s then None else Some s.[i]
)
(* write to buffers and other things without knowing what they are *)
module Ostream :
sig
type t
val of_function : (char -> unit) -> t
val of_buffer : Buffer.t -> t
val of_string : string -> t
val of_out_channel : out_channel -> t
val output_char : t -> char -> unit
val output_string : t -> string -> unit
val output_value : t -> 'a -> unit
end
=
struct
type t = char -> unit
let of_function f = f
let of_buffer (buf:Buffer.t) : t =
fun (c:char) -> Buffer.add_char buf c
let of_string (s:string) : t =
let i = ref 0 in
fun (c:char) -> s.[!i] <- c; incr i
let of_out_channel (chan:out_channel) : t =
fun (c:char) -> output_char chan c
let output_char (ostream:t) (c:char) : unit =
ostream c
let output_string (ostream:t) (str:string) =
String.iter ostream str
let output_value (ostream:t) thing =
let str = Marshal.to_string thing [] in
output_string ostream str
end
Issac
>
>
> Thanks,
> Chris
>
> PS. Please cc me on replies, I temporarily unsubscribed from the
> list, thanks!
>
> -------------------
> 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
>
>
-------------------
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] 4+ messages in thread
end of thread, other threads:[~2003-07-18 9:40 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-17 7:05 [Caml-list] string buffer as (in|out)_channel Chris Hecker
2003-07-17 7:39 ` Yaron M. Minsky
2003-07-18 9:13 ` Issac Trotts
2003-07-18 9:40 ` Issac Trotts
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox