如何避免背斜肌炎?

How to avoid backslashitis?

我有以下代码:

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 + 大括号 {} 并意识到它不保留列表结构因此注定了它。

选项 a) 全部放在一行上。

选项 b) 将代码结构化为:

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

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

一般来说,如果需要续行,则必须使用 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 中不是特别有效的命令,除非与文字参数一起使用。那是因为对于可变参数,它会在运行时将它们编译为字节码。