如何避免背斜炎?

时间:2015-09-25 22:29:59

标签: list tcl

我有以下代码:

proc list_backslash {} {

    array unset options
    array set options {
        -inputs {vdd}
        -outputs {vss}
    }

    set inputs { vdd2 vdd dvdd }
    set outputs { vss2 vss dvss }

    set updateOptions [ list \
        -inputs       $inputs \
        -outputs      $outputs ]

    array set options $updateOptions

    foreach {k v} [array get options] {
        puts "$k => $v"
    }
}

由于我在updateOptions中有很多键值对,因此存在严重的反睫毛炎!是否有更好的方法来执行代码updateOptions?我尝试了subst +大括号{},并意识到它不会保留列表结构,从而实现它。

2 个答案:

答案 0 :(得分:3)

一般来说,如果你需要继续一行,你必须使用Tcl的某种引用机制。否则,命令调用在行结束时结束。 [括号]也可以包含多个语句;这是合法的,但确实不推荐

但这确实意味着有时你会有尴尬的选择。也许你最好这样做:

set updateOptions {
    -inputs       $inputs
    -outputs      $outputs
}
foreach {key value} $updateOptions {
    set options($key) [subst $value]
}

array set命令在代码进入过程中时,在获得大量选项(数千个)之前效率不高。

或者如果你有Tcl 8.6,dict map可能更好:

array set options [dict map {key value} $updateOptions {subst $value}]

请注意subst在Tcl 8.6中不是特别有效的命令,除非与文字参数一起使用。那是因为使用变量参数,它会在运行时将它们编译为字节码。

答案 1 :(得分:2)

选项a)将所有内容放在一行上。

选项b)将代码结构为:

 set options(-inputs) $inputs
 set options(-outputs) $outputs

选项c)学会喜欢反斜杠。