Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash TCL中的ifdef等价物_Bash_Shell_Tcl - Fatal编程技术网

Bash TCL中的ifdef等价物

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

在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)]} {
   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解决方案