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

这看起来很丑陋。

[upvar] 不起作用,因为它无法链接到“参数”。

谢谢。

答案中的代码不起作用(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

命名空间和级别是两个不同的东西。对于这个问题,您不需要升级。

这是一个简单的解决方案,它创建命名空间并在一行中设置变量:

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

好的,你有两个不同的问题。首先是命名空间不存在;第二个是您需要编写代码,以便在该命名空间中创建/写入变量。总的来说,这只需要对 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 回答