【问题标题】:Pass few but not all optional arguments to a TCL procedure将少数但不是所有可选参数传递给 TCL 过程
【发布时间】:2022-11-02 04:21:00
【问题描述】:

在 TCL 中,使参数可选的方法是给它一个默认值。不知道还有没有其他方法。例如

proc my_func {a b c {d 10} {e 11} {f 12}} {
  ...
}

现在在上面的例子中,参数 a、b 和 c 是强制性的。参数 d、e 和 f 是可选的。还有另一种创建可选参数的方法吗?

我需要创建一个可以从具有一些可选参数的 TCL 终端(在 Xilinx Vivado 中)调用的参数。用户决定传递一些或全部可选参数或根本不传递。问题是,当使用位置参数传递时,不可能告诉 TCL 我们将哪个可选参数传递给它。解决方案是什么?例如

my_func 1 2 3 4 5 6 

应调用具有值 a=1、b=2、c=3、d=4、e=5 和 f=6 的 my_func。还,

my_func 1 2 3 4 

应使用值 a=1、b=2、c=3 和 d=4 调用 my_func,并且 e、f 保留其默认值。但是,我可能需要做这样的事情

my_func 1 2 3 100

我将 100 传递给 f 并将 c 和 d 保留为默认值。但是上面的语句会将 d 设置为 100,并将 e 和 f 保留为默认值。

什么是解决方案,因为我显然不能在这里使用位置参数技术。

【问题讨论】:

    标签: tcl


    【解决方案1】:

    如果您的 proc 定义中的最后一个参数实际上是 args,那么剩余的参数(如果有)将收集在一个列表中。

    这个过程演示了 d,e,f 如何是可选的。可选参数作为 {name value} 对包含在内。

    proc my_func {a b c args} {
        set defaults {d 10 e 11 f 12}
        foreach {var_name var_value} $defaults {
            set $var_name $var_value
        }
    
        foreach arg $args {
            set [lindex $arg 0] [lindex $arg 1]
        }
    
         puts "a:$a b:$b c:$c d:$d e:$e f:$f"
    }
    
    tcl8.6.8> my_func 1 2 3
      a:1 b:2 c:3 d:10 e:11 f:12
    
    tcl8.6.8> my_func 1 2 3 {d 5} {e 8} {f 99}
      a:1 b:2 c:3 d:5 e:8 f:99
    
    tcl8.6.8> my_func 1 2 3 {f 99}
      a:1 b:2 c:3 d:10 e:11 f:99
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      相关资源
      最近更新 更多