将proc变量导入命名空间

时间:2009-10-13 14:41:31

标签: tcl

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

3 个答案:

答案 0 :(得分:4)

有什么问题:

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

在我的测试中,似乎达到了同样的目标。

更新:感谢K0re指出这一点。在调用foo之前,您需要定义名称空间:

namespace eval ::foo_ns {}

答案 1 :(得分:2)

命名空间和级别是两回事。你不需要升级这个问题。

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

proc foo {param} {
    namespace eval ::foo_ns [list set x $param]
}

答案 2 :(得分: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”没有值(它只在过程中定义。你需要确保它事先被替换。我会包含可以工作的代码但是老实说,我担心它会引起对这个问题的实际答案的混淆......所以我会把它留下来。