tcl-何时使用软件包&x2B;名称空间vs interp?

tcl-何时使用软件包&x2B;名称空间vs interp?,tcl,Tcl,我只是从TCL开始,试图了解如何最好地定义和集成模块。似乎在package+名称空间的概念上投入了很多精力,但从我所能告诉您的情况来看,interp对于每个可思考的场景来说都更强大、更精简。特别是当涉及到隐藏和重命名过程时,还要注意全局名称空间中缺少爬行。使用package+名称空间的唯一原因似乎是“很久以前Sun这么说过” 我什么时候应该使用package+名称空间而不是interp?模块的目的是提供模块化代码,即模块编写者不了解和控制的应用程序可以轻松使用的代码,以及封装自身内部的代码 包名

我只是从TCL开始,试图了解如何最好地定义和集成模块。似乎在package+名称空间的概念上投入了很多精力,但从我所能告诉您的情况来看,interp对于每个可思考的场景来说都更强大、更精简。特别是当涉及到隐藏和重命名过程时,还要注意全局名称空间中缺少爬行。使用package+名称空间的唯一原因似乎是“很久以前Sun这么说过”


我什么时候应该使用package+名称空间而不是interp?

模块的目的是提供模块化代码,即模块编写者不了解和控制的应用程序可以轻松使用的代码,以及封装自身内部的代码

包名称空间和基于解释器的模块可能同样擅长封装,但要使基于解释器的模块能够很好地与任意应用程序配合使用并不容易(当然这是可能的)

我个人的观点是,口译员是应用级的(我主要用于用户输入和受控评估),而不是模块级的。名称空间和包都有它们的缺点,但在大多数情况下,它们只需最少的麻烦就能完成预期的任务


我的建议是,如果你是为了自己的利益而编写模块,而口译员为你提供了良好的服务,那么一定要使用它们。如果您编写了其他人(可能包括您自己在内)将要使用的模块,那么您应该坚持使用名称空间和包。

模块的目的是提供模块化代码,即模块编写者不了解和控制的应用程序可以轻松使用的代码,以及封装其内部的代码

包名称空间和基于解释器的模块可能同样擅长封装,但要使基于解释器的模块能够很好地与任意应用程序配合使用并不容易(当然这是可能的)

我个人的观点是,口译员是应用级的(我主要用于用户输入和受控评估),而不是模块级的。名称空间和包都有它们的缺点,但在大多数情况下,它们只需最少的麻烦就能完成预期的任务


我的建议是,如果你是为了自己的利益而编写模块,而口译员为你提供了良好的服务,那么一定要使用它们。如果您在18个月内编写了其他人(可能包括您自己)要使用的模块,那么您应该坚持使用名称空间和包。

名称空间和包可以协同工作。口译员是另一回事

名称空间是Tcl中的一个小规模命名上下文。它可以包含命令、变量和其他名称空间。您可以通过本地名称(
foo
)或限定名称(
bar::foo
)引用命名空间中的实体;如果限定名称以
开头,则它相对于(解释器)全局命名空间,并可用于从解释器中的任何位置引用其命令或变量。(FWIW,TclOO对象系统广泛构建在名称空间之上;每个对象有一个名称空间。)

包是由某种库提供的一组代码的高级概念。包具有抽象名称(名称不必与库的实现在磁盘上的存储方式相对应)和不同的版本;如果需要的话,你可以要求一个特定的版本,尽管大多数时候你并不费心。包可以通过多种机制实现,但它们几乎都归结为
source
ing一些Tcl脚本和
load
ing一些dll。几乎所有的包都声明命令,通常鼓励它们将这些命令放在与包具有相同通用名称的命名空间中。然而,相当多的旧软件包由于各种原因不这样做,主要是为了与现有代码兼容

解释器是Tcl中的安全上下文。默认情况下,Tcl会创建一个解释器(如果它在
wish
中设置控制台窗口,则会创建另一个解释器)。一个解释器中的命名实体与另一个解释器中的命名实体完全不同,但有几个关键例外:

  • 通道在所有口译员中都有通用名称。这意味着一个口译员可以谈论另一个口译员拥有的频道,但仅仅提及其名称并不能授予访问该频道的权限。(默认情况下,
    stdin
    stdout
    stderr
    频道是共享的。)

  • interp alias
    命令可用于生成别名命令,在一个解释器中调用命令(别名)可导致调用另一个解释器中的命令(实现),并安全传递所有参数。这允许一个解释器在不失去控制的情况下公开它希望另一个解释器访问的任何特殊调用,但安全地处理这些参数取决于这些命令的实现

  • 安全解释器是默认情况下具有Tcl的不安全命令的解释器。(例如
    打开
    套接字
    加载
    光盘
    ,等等)创建安全子解释器的父解释器可以使用别名机制添加所需的功能;它非常类似于OS系统调用,只是您可以轻松地创建自己的特定于应用程序的调用

    Tcl的线程包旨在为每个线程创建一个解释器(别名机制不能跨线程工作)。这意味着默认情况下共享资源的方式很少,线程间通信是通过排队消息传递完成的


    一般来说,每个解释器最多需要一次程序包,这就是您的情况