- c-like preprocessor facility - useful adaptation of preprocessing directives.. I utilize this to deal with debug control.
- static constant datasets stored in proc - fast access to static constants (enum-like) via runtime created proc.
- subject observer logic bomb - allows event driven programming to include complex logic which only runs callback on condition.
proc procInfoExample {arg1 arg2 {option1 {somedefaultvalue}}} {
set levelInfo [info level [info level]]
set procName [lindex $levelInfo 0]
puts ""
puts "Show command + args for this proc by getting info for this level:"
puts " % info level \[info level\]\n [info level [info level]]\n"
puts "Get this Proc Name:"
puts " % lindex $levelInfo 0\n [lindex $levelInfo 0]\n"
puts "Arguments:"
puts " % info args $procName\n [info args $procName]\n"
puts "What about determining default value for optional arguments?:"
puts " NOTE 1: true (has a default value), 0: false (there is no default value)\n"
foreach arg [info args $procName] {
puts " % puts \[info default $procName $arg ret\] : \$ret\n [info default $procName $arg ret] : $ret\n"
}
}
procInfoExample test test
Show command + args for this proc by getting info for this level:
% info level[info level]
procInfoExample test test
Get this Proc Name:
% lindex procInfoExample test test 0
procInfoExample
Arguments:
% info args procInfoExample
arg1 arg2 option1
What about determining default value for optional arguments?:
NOTE 1: true (has a default value), 0: false (there is no default value)
% puts [info default procInfoExample arg1 ret] : $ret
0 :
% puts [info default procInfoExample arg2 ret] : $ret
0 :
% puts [info default procInfoExample option1 ret] : $ret
1 : somedefaultvalue
%Error Handling snippetspflags
# pflags --
# returns a string with a consise representation of flags stored as an integer up to system
# bit width. Note output only produces response for flags set. (value=1)
#
proc pflags {label flags flagDefinition} {
array set flagArray $flagDefinition
set result {}
set LF "\n"
# determine appropriate indention
set indent [string repeat { } [expr {[string length $label]}]]
# enforces 8 bit boundry
set bitwidth [string length [format {%b} $flags]]
set bitwidth [expr { (($bitwidth - 1) / 8 + 1) * 8 }]
set bits [format "%0${bitwidth}b" $flags]
set result [format { %s: %s (%d)%s} $label $bits $flags $LF]
set callouts [string map {0 { } 1 {T}} $bits]
append result [format { %s %s %s} $indent $callouts $LF]
set callouts [string map {{T} {|}} $callouts]
set tail {+}
foreach flag [lsort -increasing -integer [array names flagArray]] {
set callouts [string range $callouts 0 end-1]
set tail [format {%s-} $tail]
if {($flags & $flag) > 0} {
append result [format { %s %s%s %s %s} $indent $callouts $tail $flagArray($flag) $LF]
}
}
return $result
}
% pflags errorCode 63 {
1 {error}
2 {reserved by tcl}
4 {reserved by tcl}
8 {failed to create interp}
16 {failed to cleanup interp}
32 {failed to load last state}
}
errorCode: 00111111 (63)
TTTTTT
|||||+- error
||||+-- reserved by tcl
|||+--- reserved by tcl
||+---- failed to create interp
|+----- failed to cleanup interp
+------ failed to load last state
%this statevar proc this {statevar} {
# this --
# The proc 'this' returns various information about the stack without having
# to remember the programatic idioms behind it.
switch -exact $statevar {
procName { return [lindex [info level [expr {[info level] - 1}]] 0] }
commandString { return [dict get [info frame [expr {[info level] - 1}]] cmd] }
usage {
set procName [lindex [info level [expr {[info level] - 1}]] 0]
set usage {}
# identify args
foreach arg [info args $procName] {
if {[info default $procName $arg defaultValue]} {
lappend usage [format {?%s?} $arg]
} else {
lappend usage $arg
}
}
return [format {"%s %s"} $procName $usage]
}
default {
return [format {bad statevar "%s" must be: $stateVars}
}
}
}
% proc testThisProc {reqVar1 {optVar2 Var2DefaultValue} {optVar3 {}}} {
puts " procName: [this procName]"
puts " commandString: [this commandString]"
puts " usage: [this usage]"
}
% testThisProc reqVar1ValueTest
procName: testThisProc
commandString: testThisProc reqVar1ValueTest
usage: "testThisProc reqVar1 ?optVar2? ?optVar3?"

