Anyway, its just something to play around with. Here's a sample:
namespace eval animal {
variable sound "silence..."
proc sayIt {what} {
variable sound
puts "[namespace current]: '$what' sounds like '$sound'"
}
}
namespace eval dog {
inherits ::animal
variable sound "ruff, ruff"
}
namespace eval cat {
inherits ::animal
variable sound "meeeeeow"
}
> animal::sayIt hello
::animal: 'hello' sounds like 'silence...'
> dog::sayIt hello
::dog: 'hello' sounds like 'ruff, ruff'
> cat::sayIt hello
::cat: 'hello' sounds like 'meeeeeow'
And here's the script:
------------------------
catch {namespace delete spoons}
namespace eval spoons {
proc proc {name args body} {
if {[uplevel 1 namespace current] == "::"} {
_proc $name $args $body
return
}
set methodBody "uplevel 1 \{$body \}"
_proc ::methods::${name} $args $methodBody
set script "_proc $name \{$args\} \{\n ::methods::$name $args\n\}"
uplevel 1 $script
}
::proc inherits {supers} {
foreach i $supers {
foreach v [info vars ${i}::*] {
set var [namespace tail $v]
if {[array exists $v]} {
uplevel array set $var [array get $v]
} else {
if {[catch {set val [set $v]}]} {
uplevel variable $var
} else {
uplevel variable $var $val
}
}
}
foreach p [info procs ${i}::*] {
set thisProc [namespace tail $p]
set thisArgs [info args $p]
set thisBody [info body $p]
uplevel _proc $thisProc \{$thisArgs\} \{$thisBody\}
}
}
}
namespace export proc
namespace export inherits
}
if {[info command _proc] == "_proc"} {
rename proc ""
} else {
rename proc _proc
}
namespace import ::spoons::proc
namespace import ::spoons::inherits
> Here's a cute script that adds inheritance to namespaces. It's kinda
> neat if you want a very limited oo tcl, but you want all the existing
> tools you use to work (i.e. your syntax hilighting editors,
> application builders, debuggers, etc know about tcl namespaces, but
> not about itcl, otcl, xotcl, tcl++, tclpp, stooop, etc.). The script
> needs a lot of work (need to fix namespace deletion,
> 'info body ns::method' doesn't give you what you expect, doesn't work
> for
> tcl 8.2 etc.).
Interesting; it belongs in the wiki, I'd say!
Miguel