# This is a simple study for a chan command as # suggested in TIP 208. 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 # - on the object level (per stream) via a mixin class, or # - on the class level (for all streams) via a instmixin class, # - as well as a mixin on the chan command... 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 ===== -- Category [XOTcl Code]