【问题标题】:How to use entries in a listA to refer other lists with names that have prefixes same as ListA's entries如何使用 listA 中的条目来引用具有与 ListA 条目相同前缀的名称的其他列表
【发布时间】:2021-12-29 17:00:02
【问题描述】:

#假设我有一个列表名称

set modules [list]
lappend modules moduleA
lappend modules moduleB
lappend modules moduleC

#我还有其他列表命名

set moduleA_sig [list]
lappend moduleA......
set moduleB_sig [list]
lappend moduleB_sig ....
set moduleC_sig [list]
lappend moduleC_sig ....

#如何使用我的“模块”列表条目来访问其他列表,例如:

foreach mod $modules 
{
    llength ${mod}_sig
} 

【问题讨论】:

    标签: scripting tcl formal-verification


    【解决方案1】:

    这是你想要upvar 命令的地方 将一个变量“别名”为另一个变量。

    set modules {moduleA moduleB moduleC}
    
    set moduleA_sig {1 2 3 4}
    set moduleB_sig {11 22 33 44}
    set moduleC_sig {111 222 333 444}
    
    foreach mod $modules {
        upvar 0 ${mod}_sig this
        puts [list $mod $this]
    }
    

    输出

    moduleA {1 2 3 4}
    moduleB {11 22 33 44}
    moduleC {111 222 333 444}
    

    这里用level 0表示当前栈帧。

    您对$this 所做的任何修改都将反映在$moduleX_sig 中。

    set x 42
    upvar 0 x y
    incr y
    puts $x      ;# => 43
    

    【讨论】:

      【解决方案2】:

      使用upvar 的替代方法是使用set <var_name> 来检索var_name 的值。当 ${mod}_sig 时,您可以使用 set 检索变量的值,而不会更改原始变量的值(如 upvar

      set modules {moduleA moduleB moduleC}
      
      set moduleA_sig {1 2 3 4}
      set moduleB_sig {11 22 33 44}
      set moduleC_sig {111 222 333 444}
      
      foreach mod $modules {
          # Get the value of the variable named ${mod}_sig.
          puts "$mod: [set ${mod}_sig]"
      }
      

      【讨论】:

        【解决方案3】:

        另一种方法是使用数组(或dict)来保存值,而不是尝试在运行时动态组合变量名。

        数组:

        #!/usr/bin/env tclsh
        
        set modules {moduleA moduleB moduleC}
        
        set sig(moduleA) {1 2 3 4}
        set sig(moduleB) {11 22 33 44}
        set sig(moduleC) {111 222 333 444}
        
        foreach mod $modules {
            puts "$mod: $sig($mod)"
        }
        

        或者使用字典:

        #!/usr/bin/env tclsh
        
        set modules {moduleA moduleB moduleC}
        
        dict set sig moduleA {1 2 3 4}
        dict set sig moduleB {11 22 33 44}
        dict set sig moduleC {111 222 333 444}
        
        foreach mod $modules {
            puts "$mod: [dict get $sig $mod]"
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-22
          • 1970-01-01
          • 1970-01-01
          • 2019-12-02
          • 1970-01-01
          相关资源
          最近更新 更多