5

私は次のコードを持っています:

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

構文エラーが発生しています。setupFile 変数を proc の外、つまりメイン 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 変数は、名前空間にバインドする必要があります。名前空間はグローバル名前空間にすることができます (そのための特別なコマンドがあります) が、そうである必要はありません。したがって、変数を 2 つのプロシージャ間で共有するには、変数に公開名を付ける必要があります。

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"
}

さて、それは完全な変数を共有するためのものです。値を共有したいだけであれば、他にもいくつかの選択肢があります。たとえば、次の 2 つの可能性があります。

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、および/またはグローバルを使用できます

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 に答える