TclOO对象能否在解释器之间共享/使用别名?
我正在实现DSL处理。我正在使用一个安全的解释器来TclOO对象能否在解释器之间共享/使用别名?,tcl,Tcl,我正在实现DSL处理。我正在使用一个安全的解释器来源代码输入文件 作为处理的一部分,我正在构建一个对象 比如: set interp [interp create -safe] interp expose $interp source interp eval $interp { oo::class create Graph { # ... } # add domain-specific commands here proc graph {definition}
源代码输入文件
作为处理的一部分,我正在构建一个对象
比如:
set interp [interp create -safe]
interp expose $interp source
interp eval $interp {
oo::class create Graph { # ...
}
# add domain-specific commands here
proc graph {definition} {
global graph
$graph add $definition
}
# and so on
set graph [Graph new]
}
interp eval $interp source $graphFile
是否有一种机制可以将$graph
对象别名到主解释器中?我最终得到了什么:
oo::class create Graph { # ...
}
set graph [Graph new]
set interp [interp create -safe]
interp expose $interp source
interp alias $interp graphObj {} $graph
interp eval $interp {
# add domain-specific commands here
proc graph {definition} {
graphObj add $definition
}
# and so on
}
interp eval $interp source $graphFile
puts [$graph someMethod]
别名是命令,而不是对象。但是,对于调用(而不是修改定义或创建子类等),可以在其他解释器中设置指向对象的别名:
oo::class create Example {
variable count
method bar {} { return "this is [self] in the method bar, call [incr count]" }
}
Example create foo
interp create xyz
interp alias xyz foo {} foo
xyz eval {
puts [foo bar]
}
# this is ::foo in the method bar, call 1
如果将方法调用转发到跨越解释器边界的别名,则单个方法也可以跨越解释器(有一些限制)。这就允许了各种各样的恶作剧
oo::class create Example {
variable count
method bar {caller} { return "this is $caller in the method bar, call [incr count]" }
}
Example create foo
interp create xyz
interp alias xyz _magic_cmd_ {} foo bar
interp eval xyz {
oo::class create Example {
forward bar _magic_cmd_ pqr
}
Example create grill
grill bar
}
# this is pqr in the method bar, call 1
这个问题我不清楚。您正在寻找的不是interp alias{}graphalias$interp[$interp eval{set graph}]
?谢谢,这很有帮助。我错过了一个事实:<代码> Gracalase<代码>不是一个变量——在主Ip中,我需要使用<代码> Gracalas SoMeMeod 不<代码> $Gracalas SoMeMeod < /代码>。@格伦:考虑使用<代码>命名空间删除::/<代码>在您的安全ItP中,查看删除任何不需要的命令……