0

我想知道所有 tcl 命令在哪个包中可用。例如字符串、列表等。

当我们想使用 expect 时,我们将使用 Expect 包,同样我们使用这些(字符串、列表等)命令而不导入任何包。我想知道这些都属于哪个包?

基本上我来自java ...在java“java.lang”包默认。

4

2 回答 2

1

形式上,构成 Tcl 语言核心的所有命令都由Tcl包提供。在您运行任何代码之前,您需要该软件包(并且必须是;package命令本身就是这些命令之一)。按照历史惯例,绝大多数 Tcl 命令都放在全局命名空间中,它位于所有命名空间的命令解析路径上。(逻辑上它在路径上的最后一个,除非用namespace path. ::tcl; 有些明确不支持,但相对知名;它们在::tcl::unsupported命名空间)。命名空间::oo(及其子项)是为 TclOO 保留的。

由其他包定义的命令——尤其是任何新创建的包——应该放在与包同名的命名空间中。这只是一个约定,在较旧的包(尤其是那些早于命名空间机制的包,例如 Tk 和 TclX)中没有遵循,因为保持与现有脚本的向后兼容性被认为更重要,但您肯定会发现它如果你遵循它最简单。此外,通常约定全局命名空间主要属于用户定义的应用程序,尽管来自其他包的污染程度;在你认为合适的时候破坏是你的。

命名空间的导出命令(通常应该是同名包的公共命令)可以通过以下方式在另一个命名空间中使用,而无需限定namespace import

namespace eval ::foo {
    proc grill {} { puts "grill!" }
    namespace export grill
}

namespace eval ::bar {
    namespace import ::foo::grill
    grill
    puts [namespace which grill];   # Prints ::bar::grill
    puts [namespace origin grill];  # Prints ::foo::grill
}

或者(从 Tcl 8.5 开始)您可以更新命名空间的解析路径,以便它也在另一个命名空间中查找:

namespace eval ::foo {
    proc grill {} { puts "grill!" }
}

namespace eval ::bar {
    namespace path ::foo
    grill
    puts [namespace which grill];   # Prints ::foo::grill
    puts [namespace origin grill];  # Prints ::foo::grill
}

请注意,这两种机制有些不同:对于导入的命令,该命令有一个本地委托(因为该委托实际上是一个命令,所以您可以rename使用它等),而对于路径更改,则没有这样的委托;原始名称空间中的命令直接位于解析grill该上下文中的含义期间。

于 2013-09-12T08:30:13.177 回答
0

列表和字符串不属于任何特殊包。它们是基本命令。所有变量在 tcl 中都被视为字符串。

  $ tclsh
  % set l [list 1 2 3 4 5]
  1 2 3 4 5
  % lappend l 6
  1 2 3 4 5 6
  % set str "Hello, World"
  Hello, World
于 2013-09-12T07:28:11.543 回答