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] $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 % Indeed, that is true. Now test an erraneous situation: % string match -nocase ham and eggs wrong # args: should be "string match ?-nocase? pattern string" % Well, the error message hides the '''STRING_ORIGINAL''' and shows up '''string''' instead.