等价于tcl中的#定义? PTC: TCL中有一个等价于C++定义的命令吗?我见过使用proc函数重载实现“define”的方法,只是想知道是否有人知道更直接的方法

等价于tcl中的#定义? PTC: TCL中有一个等价于C++定义的命令吗?我见过使用proc函数重载实现“define”的方法,只是想知道是否有人知道更直接的方法,tcl,c-preprocessor,Tcl,C Preprocessor,如果通过“接收相同的参数”,您的意思是重复传递相同的值给$a,$b和$c,然后,您可以选择使用全局变量而不是函数参数。在调用函数之前将值存储在其中,然后函数调用将简化为foo$d,等等。或者,您可以定义过程,以期望d和e都作为输入参数,并使用默认值(例如空字符串)例如 如果输入参数的数量未知,可以使用单词args,它将创建一个包含args中每个值的列表,例如 proc foo {a b c args } { foreach bar $args { #do whate

如果通过“接收相同的参数”,您的意思是重复传递相同的值给
$a
$b
$c
,然后,您可以选择使用全局变量而不是函数参数。在调用函数之前将值存储在其中,然后函数调用将简化为
foo$d
,等等。

或者,您可以定义过程,以期望d和e都作为输入参数,并使用默认值(例如空字符串)例如

如果输入参数的数量未知,可以使用单词
args
,它将创建一个包含
args
中每个值的列表,例如

   proc foo {a b c args } {
     foreach bar $args {
       #do whatever...
     }
   }
干杯
Brian

Tcl有一种机制,可以让您在解释器中定义

如果你有

proc foo {one two three} {do something with $one $two $three}
你会发现你总是把$a和$b作为前两个参数,你可以这样写:

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"

interp alias
命令中的空括号仅表示当前解释器。使用从属解释器可以做很多有趣的事情。

使用
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
}
在8.5中,也可以使用别名和
apply

interp alias {} foo_ab {} apply {args {
    global a b
    uplevel 1 [list foo $a $b {*}$args]
}}
在8.6中,您可以使用
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.*版本中都能正常工作。

您真正想做的是什么?编译时黑客攻击在动态语言中没有什么价值。我有一个函数,它重复很多次并接收相同的参数:foo$a$b$c$d和foo$a$b$c$e,所以我想定义foo_e和foo_d,而不是所有这些。目前,默认参数只能位于参数列表的末尾(除了尾随的
args
)。如果变量
a
b
在范围内不是全局变量,则可以将
global a b
替换为
upvar 1 a;upvar 1b b
在proc/applyIt中访问它们很遗憾,对
eval{foo$a$b}
的别名不起作用,但这会带来额外的扩展。
interp alias {} foo_ab {} namespace inscope :: {foo $a $b}