5

我有以下代码:

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

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

4

3 回答 3

16

您可以使用::.

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

proc run {} {
    puts $::setupFile
}
于 2012-04-16T18:53:53.007 回答
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 有更多选项,但仍处于测试阶段。

于 2012-04-16T18:36:05.410 回答
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";
}

第一个是首选。

于 2014-10-20T19:28:27.137 回答