rename proc _proc
_proc proc {name args body} {
if {[info commands $name]!=""} {
puts stderr "warning: [info script] redefines $name"
}
_proc $name $args $body
}From the time that is sourced, any attempt to override a proc name will be reported to stderr (on Win-wish, it would show on the console in red). You may make it really strict by adding an "exit" after the "puts stderr ...", or throw an error.Known feature: proc names with wildcards will run into this trap, e.g. proc * args {expr [join $args *]*1}will always lead to a complaint because "*" fits any proc name. Fix (some regsub magic on 'name') left as an exercise.Tcl/Tk is a wish come true ;-)
NEM 2008-01-08: The title of this page also brings to mind guarded function clauses in various languages. For instance, in Haskell you see code like:
max x y
| x >= y = x
| otherwise = yHere the '|' character introduces a guard clause and can be read as "when". We can mimick this in Tcl easily enough:proc | args {
if {[uplevel 1 [lrange $args 0 end-2]]} {
return -code return [uplevel 1 [list expr [lindex $args end]]]
}
}
proc otherwise {} { return 1 }With this we can then write code like:proc max {x y} {
| >= $x $y = $x
| otherwise = $y
}
proc >= {a b} { expr {$a >= $b} }
