首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过方支撑到上行TCL

通过方支撑到上行TCL
EN

Stack Overflow用户
提问于 2018-08-28 10:51:12
回答 2查看 218关注 0票数 0

我有一个代码,在该代码中,我要传递一个要由TCl uplevel #0计算的列表。虽然它运行良好,但如果我给它一个使用大括号的代码来包装方括号,例如:

代码语言:javascript
复制
uplevel #0 { puts [ info vars CCK_* ] }

当我使用列表时,我无法接受,即:

代码语言:javascript
复制
uplevel #0 [list puts "\[" info vars CCK_* "\]" ]

我得到:

代码语言:javascript
复制
wrong # args: should be "puts ?-nonewline? ?channelId? string"
    while executing
"puts {[} info var CCK_* \]"
    ("uplevel" body line 1)
    invoked from within
"uplevel #0 [ list puts "\[" info var CCK_* "\]" ]"

我需要list命令,因为其他一些代码需要对变量名进行评估,这必须发生在上行层接受顺序之前(即输入到上行层)。例如:

代码语言:javascript
复制
if { [ getpoint $elem ] == $pointy }

当要在上行层中计算[ getpoint $elem ]时,实际上在调用过程中定义和设置了尖,因此我不能对其使用大括号,因此在调用上行层之前将进行评估,并且只会得到一个数字。

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-28 11:33:02

组装要提交到上行层等的脚本(或命令序列)并不一定最好使用list。例如,带有嵌套计算的脚本就是这样。

你的问题措辞对我来说并不十分清楚(所以我可能不正确地解释它),但你可能想考虑使用[subst][string map]作为你的目的吗?

观看:

代码语言:javascript
复制
set CCK_1 ""

proc foo {someVarName} {
    uplevel "#0" [subst -nocommands {
    if {"$someVarName" in [info vars CCK_*]} {
        puts "Found $someVarName"
    }
   }]
}

foo CCK_1; # prints "Found CCK_1"
foo CCK_2

List更适合于命令序列,而不需要过多的计算嵌套;对于完整的脚本,最好使用基于[subst][string map]的脚本模板。注意:[subst][string map]不保护替换值,并将它们以文字形式放置在脚本中。

更新

这并不是说您的原始片段无法工作:

代码语言:javascript
复制
set CCK_1 ""
# a) non-robust variant
proc bar {pattern} {
    uplevel "#0" puts "\[info vars $pattern\]"
    # equiv of
    uplevel "#0" [concat puts "\[info vars $pattern\]"]
    # versus
    uplevel "#0" [list puts "\[info vars $pattern\]"]
}

bar CCK_*

set "CCK _1" ""
# b) robust variant
proc bar-robust {pattern} {
    uplevel "#0" puts "\[[list info vars $pattern]\]"
    # equiv of
    uplevel "#0" [concat puts "\[[list info vars $pattern]\]"]
}

bar-robust "CCK _*"

uplevel通过对其参数进行[concat]来组装要计算的脚本。就像提供一个单一的[concat]'ed参数一样。您不会在这里使用list来组装整个脚本,而是保护程序集中的脚本组件(参见bar-robust)。这里的保护意味着复杂的值在脚本组装过程中保持原意(例如,匹配模式包括.空格:CCK _*)。

票数 1
EN

Stack Overflow用户

发布于 2018-08-28 12:35:36

我的建议是分两步运行代码。首先,在方括号中运行代码,然后在第二个调用中使用该结果。当然,因为您只是在做一个puts,所以没有必要通过uplevel运行它

代码语言:javascript
复制
set result [uplevel #0 [list info vars CCK_*]
puts $result

如果使用puts用于说明性目的,那么我认为两次调用uplevel的一般想法仍然有效:将方括号中的代码作为一个不同的步骤运行,然后将其与其他代码组合以获得最终结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52056090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档