2014-11-24 146 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的是未定义所以在这里把它定义”}

多一点打字,但很明显发生了什么事,可以用在任何信息可以检查。