如何避免背斜肌炎?
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 中不是特别有效的命令,除非与文字参数一起使用。那是因为对于可变参数,它会在运行时将它们编译为字节码。
我有以下代码:
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 中不是特别有效的命令,除非与文字参数一起使用。那是因为对于可变参数,它会在运行时将它们编译为字节码。