proc ::tcl::dict::get? {args} { try { ::set x [dict get {*}$args] } on error message { ::set x {} } return $x } namespace ensemble configure dict -map [dict merge [namespace ensemble configure dict -map] {get? ::tcl::dict::get?}]
This should check the error message before unilaterally clearing the return value, but well, it work like this.
AMG: Here is an improved version of the above that does check which error occurs.
proc ::tcl::dict::get? {args} { ::try {get {*}$args} trap {TCL LOOKUP DICT} {} {} } namespace ensemble configure dict -map [dict merge\ [namespace ensemble configure dict -map]\ {get? ::tcl::dict::get?}]
Now let's add a default value, implemented using argparse so as to allow the variadic arguments to be in the middle of the argument list:
proc ::tcl::dict::getwithdefault {args} { ::argparse {dictionary keys* default} ::try { get $dictionary {*}$keys } trap {TCL LOOKUP DICT} {} { ::set default } } namespace ensemble configure dict -map [dict merge\ [namespace ensemble configure dict -map]\ {getwithdefault ::tcl::dict::getwithdefault}]
See also ensemble extend for details on adding commands to an ensemble.