Namespaces are really useful in Tcl as they permit commands and variables to be conveniently grouped together. This means that common command names can be reused within specific contexts, and that variables can be 'hidden' away from errant command calls. All this extra security does come at a cost, a lost of unecessary and respetative typing. Using the gnocl:: namespace prefix is useful if, lets say, there is a need for mixed Tcl and Gnocl programming. But, if there isn't this need what can be done to alleviate the typing burden, albeit with some risks when coming to readability and portability between applications? Variables and commands embedded within a namespace can undergo export-import process or they can be renamed.
The following code example shows how this can be done. When exporting and importing between namespaces its possible to have a naming conflict in the importing namespace. Tcl will pick this up and result in an error. Fortunately this only applies to a handful of instances and in most cases (e.g. list and listStore) command synonyms are built into the gnocl core.
# !/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
package require Gnocl
# what namespaces are present?
puts [namespace children ]
# export all gnocl command and widge names
namespace eval ::gnocl {
namespace export application listStore button menu window
foreach class [widgets] { namespace export $class }
foreach class [commands] { namespace export $class}
}
foreach class [gnocl::widgets] {
if { [catch { namespace import gnocl::$class } err] } { puts WIDET-$err }
}
foreach class [gnocl::commands] {
if { [catch { namespace import gnocl::$class } err] } { puts COMMAND-$err}
}
set x 200 ; set dx 400
set opts "-y 400 -width 300 -height 200"
# EXAMPLE 1) create app from and array
array set app [application]
$app(topLevel) show
set lst [listStore -columns 2 -types {string string}]
$lst add [list [list a b] [list b c] ]
$app(container) add $lst -fill 1 -expand 1
$app(topLevel) configure -x [incr x $dx] {*}$opts
# EXAMPLE 2) using aliass
interp alias {} g_window {} gnocl::window
g_window -child [gnocl::text] -x [incr x $dx] {*}$opts
# EXAMPLE 3) renaming commands
foreach class [gnocl::widgets] {
rename gnocl::$class gcl::$class
}
gcl::window -child [gcl::button -text hello] -x [incr x $dx] {*}$opts
Comments