2014-11-24 274 views
0

在TCL中,是否有一個優雅的實現可以模仿經常在編程語言中使用的ifdef。從TCL腳本語言本身來說,我找不到TCL解釋器本地支持的方式。ifdef等效於TCL

+0

不,你想做什麼? – Kevin 2014-11-24 22:34:33

+0

基於一個特定的項目,我可能需要將命令更改爲支持TCL語言芯片設計的工具。例如,'ifdef PROJ_FOO set_lib x'else set_lib y'endif - 這是意圖 – Mike 2014-11-24 22:44:32

+0

http://www.gnu.org/software/m4/ – Kevin 2014-11-24 22:46:39

回答

5

除了標準的「if」語句外,沒有內置於Tcl的內容等同於「ifdef」。如果你不喜歡標準的「if」語句,tcl給你所有的基本構建塊來創建你自己的「ifdef」命令。

例如,ifdef實際上只不過是查找定義值的if語句而已。一個非常簡單的實現可能是這個樣子:

proc define {name value} { 
    set ::defined($name) $value 
} 

proc ifdef {name script1 else script2} { 
    if {[info exists ::defined($name)]} { 
     uplevel $script1 
    } else { 
     uplevel $script2 
    } 
} 

然後,您可以使用這樣的:

define FOO 1 
... 
ifdef FOO { 
    <do this if FOO is defined> 
} else { 
    <do this if FOO is NOT defined> 
} 
+0

ANY指向我如何構建自己的ifdef命令的指針。 – Mike 2014-11-26 07:46:56

+0

@Mike:我用一個例子更新了我的答案。我的tcl技能很生疏,但這似乎工作。對於更多生產就緒的實現,您可能需要更多的防彈措施,並使else塊可選,但我希望它能提供一個想法。 – 2014-11-26 13:18:22

+0

非常感謝。這是切片解決方案 – Mike 2014-11-27 16:01:25

4

如果你嘗試檢查一個環境現狀變量,你可以這樣做:

if {[info exists ::env(PROJ_FOO)]} { 
    set_lib x 
} else { 
    set_lib y 
} 

假設你有一些Tcl命令叫set_lib

+0

set_lib是一個特定於工具的命令。看起來唯一的辦法就是設置一個ENV變量,就像在SHELL編程語言中一樣。我在想是否有任何命令行選項來選擇性地運行代碼。 tcl -f foo.tcl -define PROJ_FOO(避免設置ENV變量) – Mike 2014-11-25 23:45:46

0

看看[信息存在的varName]和類似。例如:

如果{[信息存在myVar的]!} {放「myVar的是未定義所以在這裏把它定義」}

多一點打字,但很明顯發生了什麼事,可以用在任何信息可以檢查。