0

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

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

我想通过使用实现 my_function namespace eval ::my_internal_namespace [uplevel ...],可能在一个循环中。虽然这不是立即很有用,但我稍后会对其进行增强以做更多的事情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 中声明他们想要的一些事实和行为,其中这些事实和行为的参数在调用者的上下文中进行评估,例如,获取变量的值或在调用者的命名空间和范围内执行其他替换。

4

1 回答 1

1

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

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

仅仅做一个相当昂贵的namespace eval; 如果代码相对受信任,我不会打扰。

于 2013-02-09T11:13:49.907 回答