GN This is a simple study for a chan command as suggested in TIP 208 by using XOTcl. The following commands are implemented
chan blocked ; # fblocked chan close ; # close chan fconfigure ; # fconfigure chan open ; # open chan puts ; # puts
We define here a Class chan, which is used to provide an ensemble-like interface as well as an object oriented interface (creating instances). We use here xotcl's forwarding mechanism. The same could be achieved via renaming or by implementing the methods in C.
Class chan chan proc unknown {m args} { chan puts "unknown chan method '$m $args' called defined: [lsort [my info commands]]" } chan forward blocked ::fblocked chan forward close ::close chan forward fconfigure ::fconfigure chan forward open ::open chan forward puts ::puts
Now we can use the chan command:
set c [chan open /tmp/junk w] chan puts -nonewline $c "hello" chan puts $c " world" chan close $c chan xxx
In order to define an OO interface for streams, we can extend the definitions:
# allow configuration of a stream name chan parameter stream # redefine "new" such it creates and # opens a stream and creates as well an instance chan proc new args { set stream [eval chan open $args] my create $stream -stream $stream ;# create object } # close stream and destroy object chan instproc destroy {} { chan close [my stream] next } # handle other subcommands (methods) via unknown chan instproc unknown {m args} { set valid [lsort [chan info instcommands]] stderr puts "unknown chan method '$m' $args called; defined methods: $valid" } # define forwarders to the chan ensemble chan instforward puts ::chan puts {%@-1 %my stream} chan instforward blocked ::chan fblocked {%my stream} chan instforward fconfigure ::chan fconfigure {%my stream} # create standard streams chan create stdout -stream stdout chan create stderr -stream stderr
Now we can use the chan OO interface:
set c [chan new /tmp/junk w] $c puts -nonewline "hello" $c puts -nonewline " world" $c puts "" $c xxx stderr puts "currently open streams: [chan info instances]" $c destroy stderr puts "currently open streams: [chan info instances]"
A reflection interface an be established
Class StreamReflect foreach m {puts blocked fconfigure} { StreamReflect instproc $m args { puts stderr " before [self proc] $args" set r [next] puts stderr " after [self proc] returning <$r>" return $r } } puts ===== chan instmixin StreamReflect set c [chan new /tmp/junk w] $c puts "hello" stderr puts "currently open streams: [chan info instances]" $c destroy puts ===== chan mixin StreamReflect set c [chan open /tmp/junk w] chan puts $c "hello" chan close $c puts =====