- Author: George Peter Staplin
- License: BSD/Tcl
- Downloads: http://www.xmission.com/~georgeps/implementation/software/Smalltick/
$ tclsh8.4 % source ./Smalltick.tcl % set obj [new.object] cmd-2108840903 % $obj set {var value} value % $obj get var value % $obj : foo {} { puts FOO } cmd-2108840903->foo % $obj foo FOO % $obj : bar arg { $self set [list var $arg] } cmd-2108840903->bar % $obj bar 123 123 % $obj get var 123You may notice that the instance variable setting is a little weird. This is due to the generic application of method invocation. For instance $obj -foo arg -bar arg is generalized to treat the argument to the method as a single list. If you want to pass multiple arguments define a method like so:
$obj : mul {a b} {expr {$a + $b}}and then use it in this manner:
$obj mul [list 1 2]
Redistribution/Licensing: OLL
#Copyright 2004 George Peter Staplin proc get.unique.command.name {} { while 1 { if {"" == [info commands [set n cmd[clock clicks]]]} { return $n } } } proc instance.handler {obj args} { if {":" == [lindex $args 0]} { proc $obj->[lindex $args 1] \ [lindex $args 2] \ "set self $obj; [lindex $args 3]" return $obj->[lindex $args 1] } else { set r "" foreach {msg arg} $args { switch -- [llength $arg] { 0 { set r [$obj->[set msg]] } 1 { set r [$obj->[set msg] [lindex $arg 0]] } 2 { set r [$obj->[set msg] [lindex $arg 0] [lindex $arg 1]] } 3 { set r [$obj->[set msg] [lindex $arg 0] [lindex $arg 1] [lindex $arg 2]] } 4 { set r [$obj->[set msg] [lindex $arg 0] [lindex $arg 1] [lindex $arg 2] [lindex $arg 3]] } 5 { set r [$obj->[set msg] [lindex $arg 0] [lindex $arg 1] [lindex $arg 2] [lindex $arg 3] [lindex $arg 4]] } } } return $r } } proc new.object {} { set obj [get.unique.command.name] interp alias {} $obj {} instance.handler $obj $obj : ?set {var value} { if {![info exists ::_priv_instances($self,$var)]} { return -code error "expected $var to exist in $self" } set ::_priv_instances($self,$var) $value } $obj : decr var { incr ::_priv_instances($self,$var) -1 } $obj : destroy {} { foreach cmd [info commands [set self]*] { rename $cmd {} } array unset ::_priv_instances [set self],* } $obj : get var { return [set ::_priv_instances($self,$var)] } $obj : incr var { incr ::_priv_instances($self,$var) } $obj : set {var value} { set ::_priv_instances($self,$var) $value } return $obj }
escargo 5 Jul 2004 - Could you explain what you mean when you say, "It uses instance inheritance...." What other object systems (not just Tcl ones) are like this? Is it like prototype-based systems?George Peter Staplin: July 5, 2004 - I mean that methods and instance variables can be added at any time -- in or out of a class. Some object systems only allow adding a method or variable within a class which the object or another class inherits-from/extends-with.escargo 6 Jul 2004 - Does that mean if I dynamically update a class, that existing instances will then inherit the changes? How does instance inheritance do inheritance?