相当于tcl中的#define?

n00*_*mer 3 tcl c-preprocessor

tcl 中是否有等价于 C++ #define 的命令?我已经看到了使用 proc 函数重载来实现“定义”的方法,只是想知道是否有人知道更直接的方法

Don*_*ows 5

使用的interp alias允许您使用的内容a,并b在别名创建时间:

interp alias {} foo_ab {} foo $a $b
Run Code Online (Sandbox Code Playgroud)

如果您需要在调用时使用这些值,则需要一个辅助过程:

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
}
Run Code Online (Sandbox Code Playgroud)

在 8.5 中,这也可以用别名和apply

interp alias {} foo_ab {} apply {args {
    global a b
    uplevel 1 [list foo $a $b {*}$args]
}}
Run Code Online (Sandbox Code Playgroud)

在 8.6 中,您可以使用tailcall以下命令进一步优化:

interp alias {} foo_ab {} apply {args {
    global a b
    tailcall foo $a $b {*}$args
}}
Run Code Online (Sandbox Code Playgroud)

您还可以使用其他一些更肮脏的技巧,例如:

interp alias {} foo_ab {} namespace inscope :: {foo $a $b}
Run Code Online (Sandbox Code Playgroud)

虽然这不是特别快,但它确实适用于所有 Tcl 8.* 版本。