Tcl 中的 interp 命令

Tha*_*e23 1 tcl

我正在学习 Tcl,现在我在 tcl 命令interp上被阻止

我读到此命令用于创建和操作解释器,但是什么是解释器以及何时使用它们?

Don*_*ows 5

Tcl 解释器是执行上下文。每个解释器都有自己的命名空间、命令和全局变量;它们不共享任何东西(除了一些东西,比如当前的工作目录,它们是进程全局的)。解释器被创建为普通解释器(具有完整的内置 Tcl 命令集)或安全解释器,其中没有暴露的命令会对外部世界产生不利影响。

一般来说,解释器是相互隔离的(隔离是一种安全特性),但有可能在它们之间做一些交叉的事情:主要是父解释器可以告诉它的一个子解释器为它评估脚本并返回结果,父解释器可以将别名命令放在子命令中,当调用该命令时,将调用父进程中传递父进程的(指定的)命令。这样做的结果是,您可以将父子关系视为有点像 OS 内核和用户进程之间的关系,而 alias 命令就像系统调用。(这不是一个完美的类比,所以不要想太多。)

set foo [interp create -safe]
proc sayhelloto {who} {
    puts "Hello, $who!"
}
interp alias $foo hello {} sayhelloto

interp eval $foo {
    hello "World"
    hello "ThaDome23"
    exec echo rm -rf evilstuff
}
# Hello, World!
# Hello, ThaDome23!
# error: no such command 'exec'
Run Code Online (Sandbox Code Playgroud)

因此,只要您需要独立的执行上下文,就可以使用额外的解释器。它们是重量级的,所以你不想经常创建它们,但它们比另一个过程便宜得多。

最后,每个解释器都绑定到创建它的线程。不同的线程总是使用独立的 interps。