Стандартных команд для этого не существует, потому что число возможных команд для всех различных вещей, которые могут быть выполнены, становится слишком большим; для вас предусмотрены только общие случаи (точный выбор частично зависит от того, что является технически однозначным, учитывая, что словари Tcl допускают произвольные значения в качестве ключей по схеме ). Вместо этого dict update
и dict with
предоставляются в качестве инструментов, позволяющих людям самим создавать свои решения.
В частности, делая предположение , что мы добавляем ровно один элемент списка и с dict update
, upvar
и некоторой рекурсией, мы можем сделать это:
proc dict_lappend_item {dictVar args} {
upvar 1 $dictVar d
if {[llength $args] == 1} {
lappend d [lindex $args 0]
} else {
set args [lassign $args key]
dict update d $key inner {
dict_lappend_item inner {*}$args
}
}
return $d
}
Вот как это использовать:
% set test [dict create]
% dict set test 1 "flps" "o1"
1 {flps o1}
% dict_lappend_item test 1 flps o2
1 {flps {o1 o2}}
% dict_lappend_item test 1 flps o3
1 {flps {o1 o2 o3}}
Похоже, что это делать то, что вам нужно. (Обратите внимание, что dict lappend
не делает этого предположения; вместо этого он обрабатывает случай добавления-множественных элементов, который имеет некоторые истинные проблемы производительности, если не обрабатывать это специально в C коде.)
Вы можете подключить описанную выше процедуру к dict
.
set map [namespace ensemble configure dict -map]
dict set map additem ::dict_lappend_item
namespace ensemble configure dict -map $map
, а затем можете сделать:
% dict additem test 1 flps o4
1 {flps {o1 o2 o3 o4}}
Осторожнее, если вы сделаете это. Возможно переопределение стандартных реализаций подкоманд, но это рецепт кода, который не работает, если вы не слишком осторожны в отношении следования существующему API.