首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法理解TCL中的上行命令

无法理解TCL中的上行命令
EN

Stack Overflow用户
提问于 2012-07-18 11:39:44
回答 2查看 7.1K关注 0票数 7

我在理解TCL中的uplevel的使用时遇到了一些问题。我正在阅读Brent Welch在TCL和Tk中的实践编程,其中有一个uplevel的例子,我无法理解。这就是它:

代码语言:javascript
复制
proc lassign {valueList args} {
  if {[llength $args] == 0} {
    error "wrong # args:lassign list varname ?varname...?"
  }
  if {[llength $valueList] == 0} {
    #Ensure one trip through the foreach loop
    set valueList [List {}]
  }
  uplevel 1 [list foreach $args $valueList {break}]
  return [lrange $valueList [llength $args] end]
}

有人能给我解释一下吗?书中的解释对我帮助不大:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-18 14:11:35

uplevel命令在与当前过程不同的作用域中执行命令(或者实际上是脚本)。特别是,在这种情况下,它是uplevel 1,意思是“在调用者中执行”。(您也可以使用uplevel #0在全局范围内执行,或者也可以在其他地方执行,比如使用uplevel 2的调用者,但这种情况非常少见。)

解释该行的其余部分:这里使用list作为构造无替换命令的一种方式,该命令由四个单词组成:foreachargs变量的内容、valueList变量的内容和break (实际上不需要用大括号括起来)。这将从valueList的前面为args中列出的每个变量分配一个值,然后停止,它将在调用方的上下文中执行此操作。

总体而言,该过程的工作方式与8.5中的内置lassign类似(假设输入列表和变量列表为非空),只是速度较慢,因为在作用域之间进行交换之类的事情比较复杂。

票数 7
EN

Stack Overflow用户

发布于 2015-02-27 18:16:24

代码语言:javascript
复制
proc a {} {
  set x a
  uplevel 3 {set x Hi}
  puts "x in a = $x"
}
proc b {} {
  set x b
  a
  puts "x in b = $x"
}
proc c {} {
  set x c
  b
  puts "x in c = $x"
}
set x main
c
puts "x in main == $x"

这里最内部的方法a在0层,b在层,c在层2,主程序在层3,所以在proc a中,如果我改变了level的值,那么我可以改变任何proc的变量x的值,无论它是a,b,c,还是方法"a“本身的main proc。尝试将级别更改为3,2,1,0,然后查看神奇的putput。

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

https://stackoverflow.com/questions/11533962

复制
相关文章

相似问题

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