有没有tcl中类似于C++ #define的命令?我看到过使用proc函数重载来实现“define”的方法,只是想知道是否有更简单直接的方式。
interp alias
允许您在创建别名时使用a
和b
的内容:interp alias {} foo_ab {} foo $a $b
proc foo_ab args {
global a b
uplevel 1 [list foo $a $b {*}$args]
# Or this in older Tcl: uplevel 1 [list foo $a $b] $args
}
apply
来编写:interp alias {} foo_ab {} apply {args {
global a b
uplevel 1 [list foo $a $b {*}$args]
}}
tailcall
进一步优化:interp alias {} foo_ab {} apply {args {
global a b
tailcall foo $a $b {*}$args
}}
您还可以使用其他一些更“肮脏”的技巧,例如:
interp alias {} foo_ab {} namespace inscope :: {foo $a $b}
虽然速度不是特别快,但它可以在所有 Tcl 8.* 版本中使用。
a
和b
不是全局范围内的,您可以使用upvar 1 a a; upvar 1 b b
替换global a b
以在proc/apply中访问它们。 - glenn jackmaneval {foo $a $b}
进行别名设置是不起作用的,因为这会多一层展开。 - Donal Fellowsproc foo {one two three} {do something with $one $two $three}
interp alias {} foo_ab {} foo $a $b
现在你可以说:
foo_ab $d ;# same as "foo $a $b $d"
foo_ab $e ;# same as "foo $a $b $e"
例子:
proc foo {one two three} {puts [join [list $one $two $three] :]}
set a Hello
set b World
interp alias {} foo_ab {} foo $a $b
foo_ab example ;# prints "Hello:World:example"
< p > interp alias
命令中的空花括号仅表示当前解释器。您可以使用从属解释器进行许多有趣的操作。
或者,您可以定义您的过程来期望d和e作为输入参数,并设置默认值(例如空字符串),例如:
proc foo {a b c {d ""} {e ""} }.....
args
,它将创建一个包含args
中每个值的列表,例如: proc foo {a b c args } {
foreach bar $args {
#do whatever...
}
}
祝你好运,Brian
args
参数)。 - Donal Fellows$a
、$b
和 $c
,那么你可以考虑使用全局变量而不是函数参数。在调用函数之前先将值存储在全局变量中,然后你的函数调用简化为 foo $d
等等。