相当于tcl中的#define?

时间:2011-02-15 16:11:53

标签: tcl c-preprocessor

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

4 个答案:

答案 0 :(得分:4)

Tcl有一种机制,可以让你在解释器中定义aliases to procedures

如果你有

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命令中的空括号仅表示当前解释器。你可以用奴隶口译员做很多有趣的事情。

答案 1 :(得分:4)

interp alias的使用允许您在创建别名时使用ab的内容:

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. *版本。

答案 2 :(得分:2)

或者你可以定义你的proc以期望d和e都是默认值(例如空字符串)的输入参数,例如。

proc foo {a b c {d ""} {e ""} }.....

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

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

欢呼声 布赖恩

答案 3 :(得分:1)

如果“收到相同的参数”表示您反复传递$a$b$c的相同值,那么您有一个选项是使用全局变量而不是功能参数。在调用函数之前将值存储在其中,然后函数调用简化为foo $d等。