获取未计算的tcl参数

获取未计算的tcl参数,tcl,language-lawyer,Tcl,Language Lawyer,我要做的是将参数解析为字符串,而不进行任何计算。 例如,如果我有一个简单的进程,它只是打印出它的参数: proc test { args } { puts "the args are $args" } 我想做的是用以下方式来称呼它: test [list [expr 1+1] [expr 2+2]] 而不是让tcl评估[列表[expr 1+1][expr 2+2]]。或者即使它被评估过 我仍然希望有原始的命令行。因此,通过琐碎的“测试” 以上程序我希望能够返回: the args a

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

proc test { args } {
    puts "the args are $args"
}
我想做的是用以下方式来称呼它:

test [list [expr 1+1] [expr 2+2]]
而不是让tcl评估
[列表[expr 1+1][expr 2+2]]
。或者即使它被评估过 我仍然希望有原始的命令行。因此,通过琐碎的“测试” 以上程序我希望能够返回:

the args are [list [expr 1+1] [expr 2+2]] 参数为[列表[expr 1+1][expr 2+2]]
在tcl 8.4中,这是否可能?

在将参数传递到测试中时,例如:
测试{[list[expr 1+1][expr 2+2]]}

将参数传递到测试时,例如: 测试{[list[expr 1+1][expr 2+2]]}

您不能使用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版中不可用,也不会进行后端口。您可能需要升级

使用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版中不可用,也不会进行后端口。您可能需要升级

谢谢。但是我忘了提到参数列表是传递给我的,我无法编辑参数来添加大括号。谢谢。但是我忘了提到参数列表是传递给我的,我无法编辑参数来添加大括号。谢谢。这正是我所担心的。我非常确定
信息框架
永远不会被后端口到8.4的原因是它需要大量的入侵机制来实现;它为Tcl在已经非常复杂的领域的实施增加了很多复杂性。一个后端口会造成巨大的破坏。谢谢。这正是我所担心的。我非常确定
信息框架
永远不会被后端口到8.4的原因是它需要大量的入侵机制来实现;它为Tcl在已经非常复杂的领域的实施增加了很多复杂性。一个后端口将具有巨大的破坏性。