如何全局声明一个仅在proc中使用的变量

时间:2012-04-16 18:10:27

标签: tcl

我有以下代码:

proc testList {setupFile ""} {
  if {$setupFile == ""} {
    set setupFile location
  }
}
proc run {} {
  puts "$setupFile"
}

我收到语法错误。我知道如果我在proc之外声明setupFile变量,即在主proc中,那么我可以使用命名空间附加说明:: 65WL :: setupFile使其成为全局但如果变量本身在proc中定义则不知道怎么做仅

3 个答案:

答案 0 :(得分:12)

您可以使用::引用全局命名空间。

proc testList {{local_setupFile location}} {
    # the default value is set in the arguments list.
    set ::setupFile $local_setupFile
}

proc run {} {
    puts $::setupFile
}

答案 1 :(得分:4)

特定过程运行不是本地的Tcl变量需要绑定到命名空间;命名空间可以是全局命名空间(有一个特殊的命令),但不一定是。因此,要拥有一个在两个过程之间共享的变量,您需要为其提供一个公开的名称:

proc testList {{setup_file ""}} {
  # Use the 'eq' operator; more efficient for string equality
  if {$setup_file eq ""} {
    set setup_file location
  }
  global setupFile
  set setupFile $setup_file
}
proc run {} {
  global setupFile
  puts "$setupFile"
}

现在,这是用于共享完整变量的。如果您只想共享一个值,还有其他一些替代方案。例如,这两种可能性:

proc testList {{setup_file ""}} {
  if {$setup_file eq ""} {
    set setup_file location
  }
  # Create a procedure body at run-time
  proc run {} [concat [list set setupFile $setup_file] \; {
    puts "$setupFile"
  }]
}
proc testList {{setup_file ""}} {
  if {$setup_file eq ""} {
    set setup_file location
  }
  # Set the value through combined use of aliases and a lambda term
  interp alias {} run {} apply {setupFile {
    puts "$setupFile"
  }} $setup_file
}

Tcl 8.6有更多选项,但仍处于测试阶段。

答案 2 :(得分:1)

你可以使用uplevel,upvar和/或global

proc testList {{setupFile ""}} {
  if {$setupFile eq ""} {
    set setupFile location;
    uplevel set setupFile $setupFile;
  }
}
proc run {} {
  upvar setupFile setupFile;
  puts "$setupFile";
}

proc run {} {
  global setupFile;
  puts "$setupFile";
}

第一个是首选。