example of Tcl namespaces and packages
Archive - Originally posted on "The Horse's Mouth" - 2004-12-10 03:14:34 - Graham EllisPackages in Tcl allow you to define a file of code that's going to be loaded as required at run time. Namespaces allow you to define a new set of variable and proc names that doesn't conflict with the variable and proc names in your main program - rather like giving all the variable and procs in part of your code a surname.
Although packages and namespaces are different facilities and technically not linked in any way, in practise they're often used together. I've often been asked for a simple example showing the mechanism of packages and namespaces working together ...
Here's a main program:
lappend auto_path /home/trainee/ltcl/bowbells
package require amerifruit 1.0
puts [usa::grapefruit]
Here's the file that defines the amerifruit package - it happens to be called florida.tcl in a directory called bowbells:
package provide amerifruit 1.0
namespace eval usa {
proc grapefruit {} {
puts "Big water melons"
}
}
The file bowbells/pkgIndex.tcl provides an index that links the amerifruit package to the florida.tcl file:
package ifneeded amerifruit 1.0 [list source [file join $dir florida.tcl]]
package ifneeded fruit 1.0 [list source [file join $dir clements.tcl]]
If you're worried about the syntax of this, don't be; it was genarated by the command
pkg_mkIndex . *.tcl
run in interactive mode in the bowbells directory
For further details and examples, see our training module on the subject