Version 0 of chan command in XOTcl

Updated 2004-09-25 00:40:37

# 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