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

Nit*_*esh 5 tcl

我有以下代码:

proc testList {setupFile ""} {
  if {$setupFile == ""} {
    set setupFile location
  }
}
proc run {} {
  puts "$setupFile"
}
Run Code Online (Sandbox Code Playgroud)

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

gle*_*man 13

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

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

proc run {} {
    puts $::setupFile
}
Run Code Online (Sandbox Code Playgroud)


Don*_*ows 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"
}
Run Code Online (Sandbox Code Playgroud)

现在,这是为了共享一个完整的变量。如果您只想共享一个值,还有其他一些选择。例如,这两种可能性:

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"
  }]
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)

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