Tcl package Command
last modified April 3, 2025
The Tcl package
command provides a mechanism for loading and
managing extensions and libraries. It's essential for modular Tcl programming.
The command helps organize code into reusable components.
Basic Definition
The package
command manages Tcl packages, which are collections of
code that can be loaded on demand. Packages help organize large applications.
Key subcommands include require
, provide
, ifneeded
,
and versions
. Packages are identified by name and version numbers.
Basic Package Require
This shows the simplest usage of package require
to load a package.
package require Tk puts "Tk version: [package present Tk]"
This loads the Tk package and prints its version. The package present
command checks if a package is loaded and returns its version.
Package Provide
This demonstrates how to create and provide your own package in Tcl.
package provide mypackage 1.0 proc greet {name} { return "Hello, $name!" }
package require mypackage 1.0 puts [greet "World"]
The first file defines a package with version 1.0 and provides a simple proc. The second file requires and uses the package. The package must be in Tcl's path.
Package Version Requirements
You can specify version requirements when requiring packages.
package require Tcl 8.6 package require Tk 8.6 puts "Running Tcl [info patchlevel] with Tk [package present Tk]"
This ensures specific minimum versions of Tcl and Tk are loaded. The script will fail if these versions aren't available. Version numbers use major.minor format.
Package ifneeded
The package ifneeded
command registers how to load a package.
package ifneeded mylib 2.0 { source [file join $dir mylib.tcl] }
package require mylib 2.0
The first script registers how to load mylib version 2.0 when requested. The second script requires the package, triggering the loading mechanism. This is typically used in pkgIndex.tcl files.
Package Namespace
Packages often use namespaces to avoid naming conflicts.
package provide myns 1.0 namespace eval ::myns { variable counter 0 proc increment {} { variable counter return [incr counter] } }
package require myns 1.0 puts [::myns::increment] puts [::myns::increment]
This creates a package with its own namespace. The counter variable is protected within the namespace. The package provides the increment procedure.
Package Versions
You can query available package versions before loading.
puts "Available Tk versions: [package versions Tk]" set latest [lindex [lsort -decreasing [package versions Tk]] 0] package require Tk $latest puts "Loaded Tk version: [package present Tk]"
This lists all available Tk versions, then loads the latest one. The
package versions
command returns all known versions of a package.
Best Practices
- Namespaces: Always use namespaces in your packages.
- Versioning: Follow semantic versioning principles.
- Documentation: Document package requirements and APIs.
- Dependencies: Clearly specify package dependencies.
- Testing: Test packages with different Tcl versions.
This tutorial covered the Tcl package
command with practical
examples showing its usage in different scenarios.
Author
List all Tcl Tutorials.