我想知道所有 tcl 命令在哪个包中可用。例如字符串、列表等。
当我们想使用 expect 时,我们将使用 Expect 包,同样我们使用这些(字符串、列表等)命令而不导入任何包。我想知道这些都属于哪个包?
基本上我来自java ...在java“java.lang”包默认。
我想知道所有 tcl 命令在哪个包中可用。例如字符串、列表等。
当我们想使用 expect 时,我们将使用 Expect 包,同样我们使用这些(字符串、列表等)命令而不导入任何包。我想知道这些都属于哪个包?
基本上我来自java ...在java“java.lang”包默认。
形式上,构成 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
该上下文中的含义期间。
列表和字符串不属于任何特殊包。它们是基本命令。所有变量在 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