2009-10-13 91 views
1
proc foo {param} { 
    namespace eval foo_ns { 
    uplevel {set foo_ns::x $param } 
    } 
} 

这看起来很丑。导入proc变量到命名空间

[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 
+0

你能描述一下它是什么,你要完成,而不是只显示代码,不是吗? – RHSeeger 2009-10-13 17:59:27

+0

'uplevel [list set foo_ns :: x $ param]' – 2009-10-13 17:59:42

+0

它对我不起作用(tclsh8.4)。 %触发杆{PARAM} { 命名空间的eval foo_ns { uplevel [列表集合foo_ns :: X $ PARAM] } } %条123 不能读取 “参数”:没有这样的可变 – name 2009-10-14 11:16:35

回答

2

命名空间和级别是两个不同的东西。这个问题你不需要高级的。

下面是一个创建命名空间并设置变量,某行的简单的解决方案:

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

什么是错的:

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

在我的测试中,它似乎完成了同样的目标。

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

namespace eval ::foo_ns {} 
+0

#tclsh8。4 %触发FOO {PARAM} { 集:: foo_ns :: X $ PARAM } %FOO 123 不能设置 “:: foo_ns :: X”:父命名空间不存在 – name 2009-10-14 11:13:42

+0

格式看起来很丑陋,然而,它结束于: 无法设置“:: foo_ns :: x”:父命名空间不存在 – name 2009-10-14 11:14:23

+0

@ K0re:在调用foo之前,您必须定义命名空间: namespace eval :: foo_ns {} – 2009-10-14 15:31:44

1

好的,您有两个不同的问题。首先是命名空间不存在;第二个是你需要编写代码,以便在该命名空间中创建/写入变量。总体而言,这一要求只有海的代码细小的改动:

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”没有值(它只在过程中定义)。您需要确保它事先取得。我会包含可行的代码,但老实说,我担心这会导致与问题的实际答案混淆......所以我会放弃它。

+0

第二个代码(我之前写的代码)工作良好。 我只是不喜欢语法 - 它很丑。 第一个代码看起来更好。 谢谢。 – name 2009-10-14 16:34:33

+0

我不能跟随哪些代码是你不喜欢的......但只要你能得到它的工作和理解为什么,那么这是一切都好:) – RHSeeger 2009-10-14 16:40:04