TCL:tcl命令的默认包是什么

时间:2013-09-12 06:01:04

标签: tcl

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

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

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

2 个答案:

答案 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