2012-04-11 130 views
2

我想要做的就是将一个参数作为字符串解析为一个没有任何评估的字符串。 例如,如果我有一个平凡的PROC刚刚打印出它的参数:获取未评估的tcl参数

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

我想要做的是把它叫做:

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

,而不是有TCL评估[list [expr 1+1] [expr 2+2]]。或者即使它评估 它我仍然想要有原始的命令行。因此,与琐碎的“测试” PROC上面我想能够返回:

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

这是可能的TCL 8.4?

回答

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,也不会被回溯。你可能想升级!

+0

谢谢。这是我所害怕的。 – user1327792 2012-04-12 00:17:42

+0

我非常肯定'信息框架'永远不会回溯到8.4的原因是它需要很多侵入式机器来执行;它在已经非常复杂的领域为Tcl的实施增加了很多复杂性。回港将会造成巨大的破坏。 – 2012-04-12 05:31:06

1

当通过参数到测试,enclose them in braces,例如: 测试{[列表[EXPR 1 + 1] [EXPR 2 + 2]]}

+0

谢谢。但是我忘了提及参数列表传递给我,我不能编辑arg来添加大括号。 – user1327792 2012-04-12 00:17:08