TclOO对象能否在解释器之间共享/使用别名?

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}

我正在实现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} {
        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中,查看删除任何不需要的命令……