This extends the procedure '''string''' to accept a new sub-command '''append''': if {[catch {string append}]} then { rename string STRING_ORIGINAL proc string {cmd args} { switch -regexp -- $cmd { ^(a(p(p(e(n(d)?)?)?)?)?)$ { uplevel [list join $args {}] } default { if {[catch { set result [uplevel [list STRING_ORIGINAL $cmd] $args] } err]} then { return -code error\ [string map\ [list\ STRING_ORIGINAL string\ ": must be bytelength,"\ ": must be append, bytelength,"]\ $err] } else { set result } } } } } Now test it: % string append ham - and - eggs ham-and-eggs % Now test an "original" sub-command: % string match -nocase ham and 0 % Result is 0 -- indeed, that is true. Now test an erraneous situation: % string match -nocase ham and eggs wrong # args: should be "string match ?-nocase? pattern string" % The error message hides the '''STRING_ORIGINAL''' and shows up '''string''' instead. Another error: % string brumm bad option "brumm": must be append, bytelength, compare, (...) % The error message shows the sub-commands inclusive the newly created append.