2

我想要做的是将 tcl proc 的参数解析为字符串而不进行任何评估。例如,如果我有一个简单的过程,它只是打印出它的参数:

proc test { args } {
    puts "the args are $args"
}

我想做的是这样称呼它:

test [list [expr 1+1] [expr 2+2]]

并且没有 tcl 评估[list [expr 1+1] [expr 2+2]]. 或者即使它评估了它,我仍然希望拥有原始命令行。因此,通过上面简单的“测试”过程,我希望能够返回:

参数是 [list [expr 1+1] [expr 2+2]]

这在 tcl 8.4 中可能吗?

4

2 回答 2

3

不能用 Tcl 8.4(及之前)做到这一点;语言设计使这成为不可能。解决方法是传入未经计算的参数(并用大括号括起来)。然后,您可以随意打印它们。要获得他们的评估表格,您需要在您的过程中执行此操作:

set evaluated_x [uplevel 1 [list subst $unevaluated_x]]

这有点混乱!


如果您使用的是 Tcl 8.5,您将有另一种选择:

set calling_code [dict get [info frame -1] cmd]

info frame -1获取一个字典,其中包含调用当前过程的上下文中当前命令的描述,其键cmd是在应用替换规则之前的实际命令字符串。这应该是您想要的(尽管请注意它包含命令名称本身)。

这不适用于 8.4,也不会被向后移植。你可能想升级!

于 2012-04-11T23:45:40.460 回答
1

将参数传递给 test 时,将它们括在大括号中,例如:test {[list [expr 1+1] [expr 2+2]]}

于 2012-04-11T23:30:07.583 回答