得到无价值的tcl参数

时间:2012-04-11 23:24:35

标签: tcl language-lawyer

我想要做的是将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]]。或者即使它被评估 我仍然希望拥有原始命令行。因此,通过琐碎的“测试” 上面的过程我希望能够回归:

the args are [list [expr 1+1] [expr 2+2]]

这可能在tcl 8.4中吗?

2 个答案:

答案 0 :(得分: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,永远不会向后移植。你可能想要升级!

答案 1 :(得分:1)

将参数传递给test enclose them in braces时,例如:     test {[list [expr 1 + 1] [expr 2 + 2]]}