The following code is used: ======tcl proc lib_ME__copy_what {whatRef old new} { upvar $whatRef whatDEF global attributeDEF ARG_TYPE_ATTRIBUTE RET_TYPE_ATTRIBUTE ARG_DEFAULT set mapL [list $old $new] array set attributeDEF \ [concat {*}[lmap {k v} [array get attributeDEF $old,*] {list [string map $mapL $k] $v} ]] array set ARG_TYPE_ATTRIBUTE \ [concat {*}[lmap {k v} [array get ARG_TYPE_ATTRIBUTE $old,*] {list [string map $mapL $k] $v} ]] array set RET_TYPE_ATTRIBUTE \ [concat {*}[lmap {k v} [array get RET_TYPE_ATTRIBUTE $old,*] {list [string map $mapL $k] $v} ]] array set ARG_DEFAULT \ [concat {*}[lmap {k v} [array get ARG_DEFAULT $old,*] {list [string map $mapL $k] $v} ]] set whatDEF($new) $whatDEF($old) } ====== the syntax I recommend is ======tcl proc lib_ME__copy_what {whatRef old new} { upvar $whatRef whatDEF global attributeDEF ARG_TYPE_ATTRIBUTE RET_TYPE_ATTRIBUTE ARG_DEFAULT set mapL [list $old $new] array set attributeDEF [lmap {k v} [array get attributeDEF $old,*] {lstride [string map $mapL $k] $v} ] array set ARG_TYPE_ATTRIBUTE [lmap {k v} [array get ARG_TYPE_ATTRIBUTE $old,*] {lstride [string map $mapL $k] $v} ] array set RET_TYPE_ATTRIBUTE [lmap {k v} [array get RET_TYPE_ATTRIBUTE $old,*] {lstride [string map $mapL $k] $v} ] array set ARG_DEFAULT [lmap {k v} [array get ARG_DEFAULT $old,*] {lstride [string map $mapL $k] $v} ] set whatDEF($new) $whatDEF($old) } ====== The new command `lstride` has the same effect as `{*}` this mean create a '''flat''' list more easy example ======tcllappend x 1 2 3 => 1 2 3 lappend a {*}[list 1 2 3] => 1 2 3 lappend b [lstride 1 2 3] => 1 2 3 lappend c [list 1 2 3] => {1 2 3} ======