Tcl - добавить или изменить вложенный список в вызываемой функции
У меня есть вложенный список в родительской функции, и я хочу добавить к нему еще несколько элементов внутри одной из вызываемых функций.
proc myparent {
set mylist {}
foreach elem $listelements {
lappend mylist $elem
}
#at this point, mylist looks something like this:
# { {var1 val1} {var2 val2} {var3 val3} }
myproc1 mylist #--> want to append mylist here
#myproc1 is expected to add another sublist to mylist. mylist after myproc1 should look like this:
# { {var1 val1} {var2 val2} {var3 val3} {abc def} }
myproc2 $mylist #--> need to use the updated mylist here
}
В myproc1 я хочу добавить некоторые элементы в mylist. Я пробовал следующее:
myproc1 { {list_var -list} } {
upvar $list_var list_local
#some conditional logic
lappend list_local [list "abc" "def"]
}
Но это не работает должным образом. Подходит ли конструкция upvar для этого требования?
1 ответ
Правильный способ добавления элементов в этот список, хранящийся в вызывающей стороне:
proc myproc1 {list_var} {
upvar 1 $list_var list_local
if {[$I want to add something]} {
lappend list_local $one_element $another_element
lappend list_local $a_third_element
}
}
Рекомендуется всегда указывать количество уровней (используйте
1
в данном случае), поскольку он позволяет эффективно генерировать код, по крайней мере, в некоторых версиях. Тоже понятнее. После того, как вы сделали
upvar
, переменная фактически существует в обоих местах одновременно.
Если вы
list
, вы составляете подсписок; каждый аргумент (после имени переменной) для
lappend
становится самостоятельным элементом.