将tcl单词解析为tcl命令列表,以便进行eval或uplevel

将tcl单词解析为tcl命令列表,以便进行eval或uplevel,tcl,Tcl,我想写一个可以像这样使用的函数: my_function { cmdA argA_1 argA_2 cmdB argB_1 argB_2 cmdC argC_1 argC_2 } namespace eval my_internal_namespace { proc cmdA { args } { puts "$args" } proc cmdB { args } { puts "$args" } proc cmdC {

我想写一个可以像这样使用的函数:

my_function {
    cmdA argA_1 argA_2
    cmdB argB_1 argB_2
    cmdC argC_1 argC_2
}
namespace eval my_internal_namespace {
  proc cmdA { args } {
      puts "$args"
  }

  proc cmdB { args } {
      puts "$args"
  }

  proc cmdC { args } {
      puts "$args"
  }
}
我想通过使用
名称空间eval::my_internal_名称空间[uplevel…]
实现我的_函数,可能是在一个循环中。虽然这不是很有用,但我将在以后对其进行增强,使其不仅仅是
uplevel

my_internal_namespace
的定义如下:

my_function {
    cmdA argA_1 argA_2
    cmdB argB_1 argB_2
    cmdC argC_1 argC_2
}
namespace eval my_internal_namespace {
  proc cmdA { args } {
      puts "$args"
  }

  proc cmdB { args } {
      puts "$args"
  }

  proc cmdC { args } {
      puts "$args"
  }
}

我认为这种技术最终将允许my_函数的调用者声明他们希望从my_函数中获得的一些事实和行为,例如,在调用者的上下文中评估这些事实和行为的参数,获取变量值或在调用方的命名空间和范围中执行其他替换。

为什么不直接将单词传递给
命名空间eval
?这几乎就是Tcl在类似命令的情况下所做的。作为脚本求值是解析可信代码的一种非常简单的方法

namespace eval ::my_internal_namespace $the_user_word
对于不受信任的代码,建议使用安全的解释器。对于这些“小语言”方法,您最好创建一个别名,隐藏不想公开的其余命令,并为所有要使其可用的命令添加别名

set i [interp create -safe]
foreach cmd [$i eval {info commands}] {
    $i hide $cmd
}
foreach cmd {cmdA cmdB cmdC} {
    $i alias $cmd ::my_internal_namespace::$cmd
}
$i eval $the_user_word

这比仅仅进行
名称空间求值要昂贵得多
;如果代码是相对可信的,我就不必费心了。

扩展中也有完整的解析器,但是如果你能在合适的上下文中评估代码,为什么还要费心这么复杂呢?评估可信/不可信的代码在Tcl中非常容易,我喜欢Tcl。这方面的一些例子是:snit使用interp解析类定义,而TclOO则使用NSThanks作为答案。我不确定它是否回答了我的问题,因为现在我读了我实际问的问题,我意识到这是一个可怕的问题,没有明确说明我想做什么。所以我提出了这个问题,现在我对我想做的事情有了更多的了解: