Hi,
I was recently wondering if it is possible to redirect std-out to go to a different output stream in ML. Has anyone done anything similar? I was having trouble seeing how to do this with the Standard-ML basis...
any suggestions on directions to look at? I can see how to effectively to it by hacking the compiler... but was wondering if there is a better way... (surely!?) ?
cheers, lucas
I think you want the "setOutstream" function of the IMPERATIVE_IO signature (matched by TextIO), probably in conjunction with the "getOutstream" function. See http://www.standardml.org/Basis/imperative-io.html#SIG:IMPERATIVE_IO.setOuts...
-Matthew
On Fri, Nov 12, 2010 at 7:16 PM, Lucas Dixon ldixon@inf.ed.ac.uk wrote:
Hi,
I was recently wondering if it is possible to redirect std-out to go to a different output stream in ML. Has anyone done anything similar? I was having trouble seeing how to do this with the Standard-ML basis...
any suggestions on directions to look at? I can see how to effectively to it by hacking the compiler... but was wondering if there is a better way... (surely!?) ?
cheers, lucas
-- The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.
polyml mailing list polyml@inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
Thanks! that is exactly what I was looking for.
lucas
On 13/11/2010 01:06, Matthew Fluet wrote:
I think you want the "setOutstream" function of the IMPERATIVE_IO signature (matched by TextIO), probably in conjunction with the "getOutstream" function. See http://www.standardml.org/Basis/imperative-io.html#SIG:IMPERATIVE_IO.setOuts...
-Matthew
On Fri, Nov 12, 2010 at 7:16 PM, Lucas Dixonldixon@inf.ed.ac.uk wrote:
Hi,
I was recently wondering if it is possible to redirect std-out to go to a different output stream in ML. Has anyone done anything similar? I was having trouble seeing how to do this with the Standard-ML basis...
any suggestions on directions to look at? I can see how to effectively to it by hacking the compiler... but was wondering if there is a better way... (surely!?) ?
cheers, lucas
-- The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.
polyml mailing list polyml@inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
Lucas,
For the record, you can also achieve this kind of effect with Posix.IO.dup2. See below for sample code.
Regards,
Rob.
(*
Redirecting standard output to a file using the Posix facilities in the SML Basis Library.
Implements a stack of output files.
Rob Arthan. rda@lemma-one.com 12th November 2008.
*) local (* Open Posix.IO then Posix.FileSys structures - order matters! *) open Posix.IO Posix.FileSys TextIO; (* Take a duplicate of current stdout. *) val duplicate_stdout : file_desc = dup stdout; (* Create an initially empty stack of file descriptors: *) val stack : file_desc list ref = ref []; (* File creation mode: read/write for user, group and others, but bits set with umask(1) will be cleared as usual. *) val rw_rw_rw = S.flags[S.irusr, S.iwusr, S.irgrp, S.iwgrp, S.iroth, S.iwoth]; in (* push_out_file: start a new output file, stacking the file descriptor. *) fun push_output_file {name: string, append : bool} : unit = ( let val flags = if append then O.append else O.trunc; val fd = createf(name, O_WRONLY, flags, rw_rw_rw); in output(stdOut, "*** Redirecting output to "" ^ name ^ ""\n"); dup2{old = fd, new = stdout}; stack := fd :: !stack end ); (* pop_output_file: close file descriptor at top of stack and revert to previous; returns true if the output file stack is not empty on exit, so you can close all open output files and clear the stack with:
while pop_output_file() do ();
*) fun pop_output_file (() : unit) : bool = ( (case !stack of cur_fd :: rest => ( close cur_fd; stack := rest ) | [] => ()); case !stack of fd :: _ => ( dup2{old = fd, new = stdout}; true ) | [] => ( dup2{old = duplicate_stdout, new = stdout}; false ) ); end;
On 13 Nov 2010, at 20:39, Lucas Dixon wrote:
Thanks! that is exactly what I was looking for.
lucas
On 13/11/2010 01:06, Matthew Fluet wrote:
I think you want the "setOutstream" function of the IMPERATIVE_IO signature (matched by TextIO), probably in conjunction with the "getOutstream" function. See http://www.standardml.org/Basis/imperative-io.html#SIG:IMPERATIVE_IO.setOuts...
-Matthew
On Fri, Nov 12, 2010 at 7:16 PM, Lucas Dixonldixon@inf.ed.ac.uk wrote:
Hi,
I was recently wondering if it is possible to redirect std-out to go to a different output stream in ML. Has anyone done anything similar? I was having trouble seeing how to do this with the Standard-ML basis...
any suggestions on directions to look at? I can see how to effectively to it by hacking the compiler... but was wondering if there is a better way... (surely!?) ?
cheers, lucas
-- The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.
polyml mailing list polyml@inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
-- The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336.
polyml mailing list polyml@inf.ed.ac.uk http://lists.inf.ed.ac.uk/mailman/listinfo/polyml
On Sun, 14 Nov 2010, Rob Arthan wrote:
For the record, you can also achieve this kind of effect with Posix.IO.dup2. See below for sample code.
This looks like an interesting trick. Can it also handle output produced by the Poly/ML runtime system (exception_trace etc.)?
Makarius
On 19 Nov 2010, at 20:07, Makarius wrote:
On Sun, 14 Nov 2010, Rob Arthan wrote:
For the record, you can also achieve this kind of effect with Posix.IO.dup2. See below for sample code.
This looks like an interesting trick. Can it also handle output produced by the Poly/ML runtime system (exception_trace etc.)?
Yes, it can - who does that remind me of? :-)
Regards,
Robl