首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCL:一个过程能在另一个过程中运行并在没有upvar的情况下在它们之间共享所有vars吗?

TCL:一个过程能在另一个过程中运行并在没有upvar的情况下在它们之间共享所有vars吗?
EN

Stack Overflow用户
提问于 2015-02-24 07:43:40
回答 2查看 167关注 0票数 1

让我说我想:

代码语言:javascript
复制
proc set_valid {} {
    set valid 1
    puts "$printme"
}

proc valid_start {} {
    set valid 0
    set printme "ABC"
    valid_stop
    return valid
}

那个valid_start将返回1,如果没有upvar,我可以使用它吗?所有变量都将在进程之间共享吗?

我只想有以下几点,

代码语言:javascript
复制
proc valid_start {} {
    set valid 0
    set printme "ABC"
    ####
    set valid 1
    puts "$printme"
    ####
    return valid
}

为了能够重复一些代码行,就像对.tcl文件执行“源代码”一样,但对同一个.tcl中的特定代码块,我能这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-24 09:36:08

您可以尝试使用命令信息和eval来实现您想要做的事情。但从软件工程的角度来看,我不会再这样做了,你有点超出了函数的目的

代码语言:javascript
复制
proc proc1 {} {
    set valid 1
}

proc proc2 {} {
    set valid 0
    set code [info body proc1]
    eval $code
    puts $valid
}

proc2
票数 2
EN

Stack Overflow用户

发布于 2015-02-24 09:12:16

每个过程都有自己的局部变量;要引用调用过程的局部变量,必须使用upvar (或uplevel运行命令在正确的范围内操作它们)。

代码语言:javascript
复制
proc set_valid {{printme "the message"}} {
    upvar 1 valid valid
    set valid 1
    puts "$printme"
}

globalvariable命令非常相似,但(通常)用于分别引用全局变量和当前命名空间变量。

有了这个过程定义,您就可以完成:

代码语言:javascript
复制
proc valid_start {} {
    set valid 0
    set printme "ABC"
    # Stuff...

    set_valid $printme

    # I guess you want to return the variable contents, not the name?
    return $valid
}

您也可以通过相同的机制(参见下面的机制)传输printme变量,但我建议将“神奇可用”变量的数量保持在最低限度;如果变量是通过值发送的,通过显式传递的名称发送,或者使用globalvariable (在适当的情况下)在顶部声明的话,则更加清晰和可维护。

代码语言:javascript
复制
proc set_valid {} {
    # Emphasising that local variable names are different to the caller's names
    upvar 1 valid abc printme def
    set abc 1
    puts "$def"
}
proc valid_start {} {
    set valid 0
    set printme "ABC"
    # Stuff...
    set_valid
    return $valid
}

如果您希望您的过程像sourced那样工作,请使用uplevel 1

代码语言:javascript
复制
proc set_valid {} {
    uplevel 1 {
        set valid 1
        puts "$printme"
    }
}

这就是你做宏观事情的方式。如果您需要在其中进行代码生成,则list命令非常有用。如果你想了解更多,在这里问另一个关于堆栈溢出的独立问题。

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

https://stackoverflow.com/questions/28690489

复制
相关文章

相似问题

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