我想编写一个可以像这样使用的函数:
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声明他们想要的一些事实和行为,其中这些事实和行为的参数在调用者的上下文中被评估,例如,以获得变量的值或在调用者的名称空间和范围内执行其他替换。
答案 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
这相当昂贵;如果代码相对可信,我不会打扰。