2015-09-25 74 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)瞭解喜歡反斜槓。