From: SourceForge.net <no...@so...> - 2003-09-06 20:16:37
|
Feature Requests item #745851, was opened at 2003-05-30 02:15 Message generated for change (Comment added) made by dkf You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=360894&aid=745851&group_id=10894 Category: 15. Dict Object Group: None Status: Open Resolution: None Priority: 5 Submitted By: Joe English (jenglish) Assigned to: Donal K. Fellows (dkf) Summary: [dict merge] Initial Comment: A useful addition to [dict] would be a command that sets multiple dictionary entries in a single step: dict merge $dictval1 $dictval2 ? ... $dictvalN ? which would return a copy of $dictval1, extended or modified by the values in $dictval2. If multiple arguments are supplied, values in later arguments override those in earlier ones. That is: proc dict_merge {dict1 args} { foreach dict $args { foreach {key value} $dict { dict set $dict1 $key $value } } return $dict1 } (This was discussed on tcl-core, but the vote on TIP 111 was already in progress so it didn't make it into the initial implementation.) ---------------------------------------------------------------------- >Comment By: Donal K. Fellows (dkf) Date: 2003-09-06 21:16 Message: Logged In: YES user_id=79902 Good use case. Just what I wanted. I'd be happy to support a TIP. (I'm less certain about the C interface. Merging is a pretty trivial thing to do with the current C API after all.) ---------------------------------------------------------------------- Comment By: Joe English (jenglish) Date: 2003-09-06 02:48 Message: Logged In: YES user_id=68433 (Let's see if SourceForge is working today...) Attached patch implements [dict merge]. Documentation and test cases still missing. This might also be a useful thing to have in the C interface, should refactor. PS: for a real-live, actual use case, see 'proc myReturn' in the EXAMPLES section of return.n (r1.7), which currently uses: set options [eval [list dict create -level 1] $args] This could be replaced with set options [dict merge {-level 1} $args] ---------------------------------------------------------------------- Comment By: Joe English (jenglish) Date: 2003-05-30 18:42 Message: Logged In: YES user_id=68433 > would using C for this purpose be a significant advantage? > It increases the maintenance load, after all... So that it could be spelled [dict merge] instead of [dict_merge] :-). There are minor efficiency issues as well. But mostly, this is a useful primitive operation on dictionaries that (I feel) should be part of the core interface. ---------------------------------------------------------------------- Comment By: Donal K. Fellows (dkf) Date: 2003-05-30 09:48 Message: Logged In: YES user_id=79902 A better implementation might go like this: proc dict_merge {dict1 args} { foreach dict $args { dict for {key val} $dict { dict set dict1 $key $val } } return $dict1 } However, would using C for this purpose be a significant advantage? It increases the maintenance load, after all... ---------------------------------------------------------------------- Comment By: Joe English (jenglish) Date: 2003-05-30 02:17 Message: Logged In: YES user_id=68433 [dict merge] can also be expressed as: [eval dict replace [list $dict1] $dict2 ... $dictN] but I'd prefer a solution that doesn't involve [eval]. A variant form that operates on dictionary variables would also be useful (don't know what to call it though.) ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=360894&aid=745851&group_id=10894 |