Tcl 将proc变量导入命名空间

Tcl 将proc变量导入命名空间,tcl,Tcl,这看起来很难看 [upvar]将不起作用,因为它无法链接到“param” 谢谢 答案中的代码不适用于tclsh8.4 ---------------------- ---------------------- 问题是: % proc foo {param} { set ::foo_ns::x $param } % foo 123 can't set "::foo_ns::x": parent namespace doesn't exist 在我的测试中,它似乎实现了相同的目标 更新:感

这看起来很难看

[upvar]将不起作用,因为它无法链接到“param”

谢谢

答案中的代码不适用于tclsh8.4

---------------------- ---------------------- 问题是:

% proc foo {param} {
    set ::foo_ns::x $param
}
% foo 123
can't set "::foo_ns::x": parent namespace doesn't exist
在我的测试中,它似乎实现了相同的目标

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

proc foo {param} {
    set ::foo_ns::x $param
}
问题是:

% proc foo {param} {
    set ::foo_ns::x $param
}
% foo 123
can't set "::foo_ns::x": parent namespace doesn't exist
在我的测试中,它似乎实现了相同的目标

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

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

好的,你有两个不同的问题。第一个是名称空间不存在;第二,您需要编写代码,以便在该名称空间中创建/编写变量。总的来说,这只需要对Hai的代码稍作修改:

namespace eval ::foo_ns {}
作为对您遇到的一些问题的评论:

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
}
这不起作用,因为你实际上是在说: 在命名空间foo_ns中,运行以下代码: 在堆栈的顶层,运行以下代码: 设置foo::x$param


但是,在堆栈的顶层,变量param没有值,只有在过程中定义。你需要事先确保它被取代。我会包含一些可以工作的代码,但是,老实说,我担心这会导致与问题的实际答案混淆。。。所以我不说了。

好的,你有两个不同的问题。第一个是名称空间不存在;第二,您需要编写代码,以便在该名称空间中创建/编写变量。总的来说,这只需要对Hai的代码稍作修改:

namespace eval ::foo_ns {}
作为对您遇到的一些问题的评论:

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
}
这不起作用,因为你实际上是在说: 在命名空间foo_ns中,运行以下代码: 在堆栈的顶层,运行以下代码: 设置foo::x$param


但是,在堆栈的顶层,变量param没有值,只有在过程中定义。你需要事先确保它被取代。我会包含一些可以工作的代码,但是,老实说,我担心这会导致与问题的实际答案混淆。。。所以我将省略它。

名称空间和级别是两件不同的事情。对于这个问题,您不需要更高的级别

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

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

名称空间和级别是两件不同的事情。对于这个问题,您不需要更高的级别

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

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

你能描述一下你想要完成的是什么,而不是仅仅展示实现它的代码吗?uplevel[list set foo_ns::x$param]它不适合我Tcsh8.4proc bar{param}{namespace eval foo_ns{uplevel[list set foo_ns::x$param]}%bar 123无法读取param:没有这样的变量你能描述一下你试图完成的是什么,而不仅仅是显示实现它的代码吗uplevel[list set foo_ns::x$param]它对我不起作用Tcsh8.4.%proc bar{param}{namespace eval foo_ns{uplevel[列表集foo_ns::x$param]}%bar 123无法读取param:没有这样的变量tclsh8.4%proc foo{param}{set::foo_ns::x$param}%foo 123无法设置::foo_ns::x:父命名空间不存在格式看起来很难看,然而,它最终的结果是:不能设置::foo\u ns::x:父名称空间不能exist@K0re:在调用foo:namespace eval::foo_ns{}tclsh8.4%proc foo{param}{set::foo_ns::x$param}%foo 123无法设置::foo_ns::x:父命名空间不存在格式看起来很难看,然而,它最终的结果是:不能设置::foo\u ns::x:父名称空间不能exist@K0re:在调用foo:namespace eval::foo_ns{}2nd代码之前,您必须先定义名称空间,我之前编写的代码运行良好。我只是不喜欢它的语法——太难看了。第一个代码看起来更好。谢谢。我无法理解你不喜欢的代码。。。但只要你能让它工作并理解为什么,那么一切都很好:我以前写的第二个代码工作得很好。我只是不喜欢它的语法——太难看了。第一个代码看起来更好。谢谢。我无法理解你不喜欢的代码。。。但只要你能让它发挥作用并理解原因,那么一切都好: