【问题标题】:Getting unevaluated tcl arguments获取未评估的 tcl 参数
【发布时间】:2012-04-11 23:24:35
【问题描述】:

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

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

这在 tcl 8.4 中可行吗?

【问题讨论】:

    标签: tcl language-lawyer


    【解决方案1】:

    不能在 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,也不会永远被向后移植。您可能想要升级!

    【讨论】:

    • 谢谢。这就是我所担心的。
    • 我很确定info frame 永远不会被向后移植到 8.4 的原因是它需要大量的侵入性机制来实现;它在已经非常复杂的领域中为 Tcl 的实现增加了很多复杂性。反向移植将具有巨大的破坏性。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。但我忘了提到参数列表已传递给我,我无法编辑 arg 以添加大括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2016-05-21
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多