2015-09-25 69 views
0

我有以下代码:如何避免斜杠炎?

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

+2

tcl中的行连续反斜杠很自然,通常不被认为是丑陋的。如果你发现你自己写了很多tcl,那么学会认为它不难看。您可以很容易地说服自己:反多行语句没有反斜杠会导致混淆或不一致的语法。以JavaScript为例,看起来像是在做某件事的代码实际上做了别的事情,因为读取代码的人认为它是一个多行语句,但解释器毫不含糊地执行是两个独立的语句。所以没有反斜杠很难看。 – slebetman

回答

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与文字参数一起使用时除外一种特别有效的命令。这是因为使用可变参数时,它会在运行时将它们编译为字节码。

2

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

选项B)结构的代码为:

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

选项C)了解喜欢反斜杠。