2013-01-02 31 views
1

所以,我使用了類似名稱的線程來使用list命令來實現此功能。這是我的工作代碼:使用變量作爲TCL過程的默認值的更直觀的方法

proc E364xA::Connect [list [list VisaAlias ${E364xA::DefaultAlias}]] { 

    ::VISA::Connect $VisaAlias 
} 

現在,這是通過使用存儲在命名空間eval裏DefaultAlias值工作目前。我在想,如果有這樣像一個更直觀的方式:

proc E364xA::Connect {{VisaAlias ${E364xA::DefaultAlias}}} { 

    ::VISA::Connect $VisaAlias 
} 

這樣你就不會有兩個list命令得過且過水域。有任何想法嗎?

感謝您的幫助!

+0

一些澄清了我的回答讓。你可以保留@ HaiVu的接受答案 - 我同意這是一個更清晰的做事方式 - 但如果你想要簡潔,那麼我可能會有所幫助。 –

+0

您是否希望在過程是_created_時或過程是_called_時變量的內容?在Tcl中,這是一個非常重要的區別。 –

+0

@ acheong87我接受了你的答案,因爲它更接近於回答我問的問題。我相信HaiVu可能是解決整體問題的最好方法,但它會在它被調用時評估變量。我需要在創建時設置該值,因爲它指的是硬編碼到特定系列設備中的值。我也希望該行在視覺上與{{VisaAlias「E364xA」}}相似,我的良心不會讓我對價值進行硬編碼。 – Chrono

回答

1

也許這? (刪除以前編輯)

proc E364xA::Connect "{VisaAlias {$E364xA::DefaultAlias}}" { 

    ::VISA::Connect $VisaAlias 
} 

測試

這裏有一個簡單的測試:

set def "hello, world!" 

proc test "{var {$def}}" { 
    puts $var 
} 

test 

對外輸出:

hello, world! 
+0

不平衡大括號。 –

+0

@HaiVu - 謝謝,修正。暫時失去了互聯網。 –

+0

不,變量名是'VisaAlias'(帶有大括號)。參數列表是一個列表,所以它不會增加清晰度,使其成爲一個字符串,並將其轉換爲列表。 –

4

我沒有看到提供更多語法糖的任何不同方式。但是,你可以這樣做:

proc E364xA::Connect {{VisaAlias -use-default}} { 
    if {$VisaAlias == "-use-default"} { 
     set VisaAlias ${E364xA::DefaultAlias} 
    } 

    ::VISA::Connect $VisaAlias 
} 

實例應用:

E364xA::Connect     ;# Use the default value 
E364xA::Connect -use-default ;# Use the default value 
E364xA::Connect somethingElse ;# Non default 
+0

感謝您的迴應,我認爲這給出了代碼爲查看它的人做的最好的想法。看起來TCL不像我想要使用的功能,但我相信這完成了相同的目標。 – Chrono

+0

其實acheong87發佈了一個非常好的答案,我接受了使用雙引號來解決這個問題。看看它。 – Chrono

+1

對於Tcl 8.5及更高版本,使用'eq'進行字符串比較:http://tcl.tk/man/tcl8.5/TclCmd/expr.htm#M14 –

1

你可以使用args說法,但它的沒有比你的代碼更清晰,並且它隱藏起來事實上你的程序最多隻需要一個參數。

proc E364xA::Connect args { 
    if {[llength $args] == 0} { 
     set VisaAlias $E364xA::DefaultAlias 
    } else { 
     set VisaAlias [lindex $args 0] 
    } 
    ::VISA::Connect $VisaAlias 
} 

proc E364xA::Connect args { 
    ::VISA::Connect [expr {[llength $args] ? [lindex $args 0] : $E364xA::DefaultAlias}] 
} 
+0

謝謝,我從來沒有想過要使用參數,因爲我對TCL很新。不過,我的確同意你的看法,但並不能幫助澄清。我嘗試了幾種方法,但看起來不太好。謝謝你的想法! +1 – Chrono

+0

謝謝格倫。在工作中,我們仍然處於Tcl 8.4而沒有任何計劃升級到8.5。我直到現在才知道eq。 –

相關問題