我想要做的是将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中吗?
答案 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]]}