将tcl字解析为准备好eval或uplevel的tcl命令列表

时间:2013-02-09 10:29:38

标签: tcl

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

my_function {
    cmdA argA_1 argA_2
    cmdB argB_1 argB_2
    cmdC argC_1 argC_2
}

我想使用namespace eval ::my_internal_namespace [uplevel ...]来实现my_function,可能是在循环中。虽然这不是立即非常有用,但我稍后会对其进行增强,而不仅仅是uplevel

my_internal_namespace将被定义为:

namespace eval my_internal_namespace {
  proc cmdA { args } {
      puts "$args"
  }

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

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

我认为这种技术最终将允许my_function的调用者从my_function声明他们想要的一些事实和行为,其中这些事实和行为的参数在调用者的上下文中被评估,例如,以获得变量的值或在调用者的名称空间和范围内执行其他替换。

1 个答案:

答案 0 :(得分:1)

为什么不直接将这个词传递给namespace eval?这就是几乎 Tcl在oo::define命令等情况下所做的事情。作为脚本进行评估是解析一些可信代码的一种非常简单的方法。

namespace eval ::my_internal_namespace $the_user_word

对于不受信任的代码,建议使用安全的解释程序。对于这些“小语言”方法,您最好创建一个basic safe interpreter,隐藏您不想公开的其余命令,并为您想要提供的所有命令添加别名。 / p>

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

仅仅执行namespace eval这相当昂贵;如果代码相对可信,我不会打扰。