我想知道所有tcl命令在哪个包中可用。 例如字符串,列表等。
当我们想使用expect时,我们将使用Expect包,同样我们使用这些(字符串,列表等...)命令而不导入任何包。我想知道这些都属于哪个包?
基本上我来自java ...在java“java.lang”包默认。
答案 0 :(得分:1)
形式上,构成Tcl语言核心的所有命令都由Tcl
包提供。在运行任何代码之前需要该软件包(必须是; package
命令本身就是其中一个命令)。按照历史惯例,大多数Tcl命令都放在全局命名空间中,该命名空间位于所有命名空间的命令解析路径上。 (除非使用namespace path
显式设置,否则它在逻辑上最后会在路径上停留。)某些Tcl命令在::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
在该上下文中的含义。
答案 1 :(得分: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