我一直在使用TCL / TK,最近开始使用TCL / TK和我的自动化应用程序,我渴望知识。

要继续使用长长的隐藏功能问题,我想知道TCL / TK的任何隐藏或方便的功能或任何简单的方法来实现一些大的操作

有帮助吗?

解决方案

当Sun的营销人员宣称Tcl是“企业就绪”时,开发人员添加了以下功能:

$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2

其他提示

我最喜欢的“隐藏或方便的功能”引用如何在Tcl中起作用。我喜欢使用短语“引用是一种工具,而非规则”。我还想说“当你需要花括号时,你只需要花括号”

虽然大多数语言都有规则,必须为某些事物使用块分隔符(例如,在C中你必须使用{}来指定一个块),但Tcl并不是那么严格。

使用Tcl,您可以选择任何引用字符为您提供所需的效果。肯定有最好的做法,但最后你可以选择最能让你完成工作的引用字符。

这意味着,例如,您可以通过多种方式定义过程,包括:

proc foo {args} {
    .... body here ....
}

proc foo "args" "
    .... body here ....
"

proc foo args [some code that returns the body]

......等等。条件语句,循环和其他所有内容也是如此。 (对于不熟悉的,花括号大致相当于shell单引号,双引号就像shell双引号,方括号就像shell反引号一样。)。

现在,很多人都在看这个并说出WTF?但它确实给程序员带来了很大的力量。我们经常在comp.lang.tcl中按照“if if do”this {和$ that}'的方式提出问题,如何获得$扩展?&quot ;.答案跟着老笑话“患者:医生,我做这个医生时疼痛:不要这样做”。也就是说,如果您不喜欢使用一组分隔符获得的行为,请选择其他分隔符。仅仅因为if语句通常用花括号构造并不意味着必须用花括号构造。

这是我最喜欢的“隐藏” Tcl的特点。它并没有被隐藏 - 它在完美而简洁的Tcl(n)手册页上是正确的,但是直到你完全了解Tcl是如何工作的,其后果尚不清楚。

另一个非显而易见的特征是无法识别的命令落入称为“未知”的处理程序中。你可以重新定义。例如。将未知命令视为要评估的表达式:

$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]} 
% 2+2
4

更多示例可以在激进语言修改的维基页面找到

Tcl的[trace]命令允许您拦截对任何变量的读取和写入。这允许您在任何变量上实现观察者,并将任意复杂度的自动范围检查添加到任何变量(就像您通过setter / getter访问变量一样)。您还可以使用此技术创建自动递增变量。

proc varlimit_re {re var key op} {
  upvar $var v
  if { [regexp -- $re $v] <= 0 } {
    error "$var out of range"
  }
}

trace add variable ::myvar {write} [list varlimit_re {^[A-H]\d{3}-[0-9a-f]+$}]`

如果您尝试将'myvar'设置为与正则表达式不匹配的任何内容,则会出现运行时错误。

一个方便的功能,对于来自其他语言的人来说,不是隐藏但往往不明显的是你可以定义自己的控制结构(如果你想生活危险,甚至可以重新定义现有的控制结构)。 Tcl Wiki 上有一些例子

Tcl就是这么简单,开放的语言,隐藏的功能很少。这一切都暴露给程序员扩展和适应。

所有Tcl的“关键字”是常规的Tcl命令,包括[for],[foreach],[while]等控制结构。这意味着你可以通过在纯Tcl代码中编写新的控制结构来扩展语言。

例如, try / on / trap 结构已使用Tcl代码在Tcl 8.6a中实现。类似地,tcllib包含control :: do,一个do / while控制结构。

通过[upvar]和[uplevel]命令可以实现很多这样的功能,这些命令允许您访问变量或在不同的堆栈帧中执行代码。

恕我直言,Tcl最大的隐藏功能是 C API。使用它,它真的很容易包装核心C程序或子系统,并在Tcl中编写GUI或其他功能。虽然此功能并非Tcl独有,但Tcl旨在从头开始实现这一功能,而C API特别易于使用。

第二大隐藏功能是打包者,所有几何经理的祖父。有了这个,GUI可以拥有相当大的代码量相当大的窗口。值得注意的是,Tcl / Tk至少在10年前才进行了几何管理.net出现了。

Tcl的第三个最大特点是能够通过C API或Tcl中定义的命令来执行语言。不是LISP宏,但相当灵活。 Expect 是一个非常好的示例,它是围绕扩展基础Tcl语言构建特定于域的脚本编写的应用程序语言。

编辑:好吧,告诉我,Xt 确实有一个几何管理器,虽然我同意Nat的意见,因为它比包装更痛苦; - }

  1. [array names] 是新手询问如何迭代数组的第一个问题
  2. 此外,您可以 foreach {key1 key2} {$ list1 $ list2} {...} - 即使列表大小不同
  3. 你不应该在交换机案例之间使用注释(这不是一个很酷的功能,但是大多数开发人员都不理解的问题)
  4. rename 命令可以重命名任何函数/ proc

我认为时间命令非常棒。它并没有完全隐藏,但这并不能阻止人们询问“哪个功能更快”。偶尔在comp.lang.tcl。

任何时候你想知道“这需要多长时间?”或者“哪种方法更快?”你只需通过“时间”调用它即可。命令。没有创建对象,没有数学,没有开销,非常简单。其他语言有类似的功能,虽然有些不太优雅。

详细记录的C API也允许在Perl中轻松集成。我对Tcl / Tk的经历可以追溯到1995年,但在2000年左右,我发现了Perl / Tk并且从未回头。

最近,Tcl和Tkx Perl软件包为我们提供了现代化的GUI。上述两个模块虽然不是微不足道的,但涉及的代码相对较少,考虑到它们允许跨越语言边界做什么。这可以直接归因于优秀的API(显然是Perl的强大功能)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top