Bash TCL中的ifdef等价物
在TCL中,是否有一个优雅的实现可以模仿编程语言中经常使用的ifdef。从TCL脚本语言本身来看,我找不到TCL解释器本机支持的方法。如果您尝试检查环境变量,可以执行以下操作:Bash TCL中的ifdef等价物,bash,shell,tcl,Bash,Shell,Tcl,在TCL中,是否有一个优雅的实现可以模仿编程语言中经常使用的ifdef。从TCL脚本语言本身来看,我找不到TCL解释器本机支持的方法。如果您尝试检查环境变量,可以执行以下操作: if {[info exists ::env(PROJ_FOO)]} { set_lib x } else { set_lib y } 假设您有一个名为set_lib的Tcl命令。如果您尝试检查环境变量,您可以执行以下操作: if {[info exists ::env(PROJ_FOO)]} { s
if {[info exists ::env(PROJ_FOO)]} {
set_lib x
} else {
set_lib y
}
假设您有一个名为set_lib的Tcl命令。如果您尝试检查环境变量,您可以执行以下操作:
if {[info exists ::env(PROJ_FOO)]} {
set_lib x
} else {
set_lib y
}
假设您有一些名为set_lib的Tcl命令。除了标准的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>
}
然后您可以这样使用它:
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>
}
除了标准的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>
}
然后您可以这样使用它:
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>
}
看看[info exists varName]和类似的例子。例如: 如果{![info exists myVar]}{put myVar未定义,请在此处定义它}
输入多一点,但很明显发生了什么,可以用于信息可以检查的任何内容。看看[info exists varName]和类似的内容。例如: 如果{![info exists myVar]}{put myVar未定义,请在此处定义它}
输入多一点,但很明显发生了什么,可以用于任何信息可以检查的东西。不,你想做什么?基于一个特定的项目,我可能不得不将命令更改为一个在芯片设计中支持TCL语言的工具。例如,ifdef PROJ_FOO set_lib x else set_lib y`endif-这就是目的,没有单独的编译时和运行时,因此不需要类似的ifdef。就像@BryanOakley说的那样使用if。不,你想做什么?基于一个特定的项目,我可能不得不将命令更改为一个在芯片设计中支持TCL语言的工具。例如,ifdef PROJ_FOO set_lib x else set_lib y`endif-这就是目的,没有单独的编译时和运行时,因此不需要类似的ifdef。只要使用@BryanOakley所说的。set_lib是一个特定于工具的命令。看起来唯一的方法就是设置一个ENV变量,就像在SHELL编程语言中一样。我在想是否有任何命令行选项可以选择性地运行代码。tcl-f foo.tcl-define PROJ_foo避免设置ENV variableset_lib是一个特定于工具的命令。看起来唯一的方法就是设置一个ENV变量,就像在SHELL编程语言中一样。我在想是否有任何命令行选项可以选择性地运行代码。tcl-f foo.tcl-define PROJ_foo避免设置ENVvariable@Mike:我用一个例子更新了我的答案。我的tcl技能已经相当生疏,但这似乎奏效了。对于更适合生产的实现,您可能需要更多的防弹措施,并使else块成为可选的,但我希望它能提供一个想法。非常感谢。是斯莱克solution@Mike:我用一个例子更新了我的答案。我的tcl技能已经相当生疏,但这似乎奏效了。对于更适合生产的实现,您可能需要更多的防弹措施,并使else块成为可选的,但我希望它能提供一个想法。非常感谢。这是slic解决方案