1
proc foo {param} {
  namespace eval foo_ns {
     uplevel {set foo_ns::x $param }
  }
}

これは醜いです。

[upvar]は、「param」にリンクできないため、機能しません。

ありがとう。

回答のコードが機能しない(tclsh8.4)

-------------------------------------------

% proc bar {param} {
    namespace eval foo_ns {
      uplevel [list set foo_ns::x $param]
    }
  }
% bar 123
can't read "param": no such variable

-------------------------------------------

% proc foo {param} {
    set ::foo_ns::x $param
}
% foo 123
can't set "::foo_ns::x": parent namespace doesn't exist
4

3 に答える 3

4

何が問題になっていますか:

proc foo {param} {
    set ::foo_ns::x $param
}

私のテストでは、同じ目的を達成しているようです。

更新:これを指摘してくれたK0reに感謝します。fooを呼び出す前に、名前空間を定義する必要があります。

namespace eval ::foo_ns {}
于 2009-10-13T15:19:50.557 に答える
2

名前空間とレベルは2つの異なるものです。この問題のためにアップレベルは必要ありません。

名前空間を作成し、変数を1行に設定する簡単なソリューションを次に示します。

proc foo {param} {
    namespace eval ::foo_ns [list set x $param]
}
于 2009-10-15T10:48:30.373 に答える
1

わかりました、2つの異なる問題があります。1つは、名前空間がまだ存在していないことです。2つ目は、変数がその名前空間で作成/書き込まれるようにコードを記述する必要があることです。全体として、これにはHaiのコードのわずかな変更のみが必要です。

proc foo {param} {
    # Create the namespace if it doesn't already exist
    namespace eval ::foo_ns {}
    # Set the variable in the namespace
    set ::foo_ns::x $param
}

あなたが抱えていた問題のいくつかについての解説として:

proc foo {param} {
  namespace eval foo_ns {
     uplevel {set foo_ns::x $param }
  }
}

これは、事実上、次のように言っているため、機能しません。名前空間 "foo_ns"で、次のコードを実行します。スタックの最上位で、次のコードを実行します: "set foo :: x $ param"

ただし、スタックの最上位では、変数「param」には値がありません(プロシージャ内でのみ定義されます。事前に置換されていることを確認する必要があります。機能するコードを含めますが、正直なところ、質問に対する実際の回答と混同されるのではないかと心配しています...なので、省略します。

于 2009-10-14T12:43:59.840 に答える