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 становится самостоятельным элементом.

Другие вопросы по тегам