我一直在使用TCL / TK,最近开始使用TCL / TK和我的自动化应用程序,我渴望知识。
要继续使用长长的隐藏功能问题,我想知道TCL / TK的任何隐藏或方便的功能或任何简单的方法来实现一些大的操作
答案 0 :(得分:16)
我最喜欢的“隐藏或方便的功能”是引用如何在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语句通常用花括号构造并不意味着必须用花括号构造。
这是我最喜欢的Tcl隐藏功能。它并没有被隐藏 - 它在完美而简洁的Tcl(n)手册页上是正确的,但是直到你完全了解Tcl是如何工作的,其后果尚不清楚。
答案 1 :(得分:14)
当Sun的营销人员宣称Tcl为“企业就绪”时,开发人员添加了以下功能:
$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2
答案 2 :(得分:12)
另一个非显而易见的特性是,无法识别的命令会传递给名为“unknown”的处理程序,您可以重新定义该处理程序。例如。将未知命令视为要评估的表达式:
$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]}
% 2+2
4
的维基页面找到
答案 3 :(得分:12)
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'设置为与正则表达式不匹配的任何内容,则会出现运行时错误。
答案 4 :(得分:7)
一个方便的功能,对于来自其他语言的人来说,不是隐藏但往往不明显的是你可以定义自己的控制结构(如果你想生活危险,甚至可以重新定义现有的控制结构)。 Tcl Wiki
上有一些例子答案 5 :(得分:7)
答案 6 :(得分:7)
所有Tcl的“关键字”都是常规的Tcl命令,包括[for],[foreach],[while]等控制结构。这意味着您可以通过在纯Tcl代码中编写新的控制结构来扩展语言。
例如,仅使用Tcl代码在Tcl 8.6a中实现了try/on/trap结构。类似地,tcllib包含control :: do,一个do / while控制结构。
通过[upvar]和[uplevel]命令可以实现很多这样的功能,这些命令允许您访问变量或在不同的堆栈帧中执行代码。
答案 7 :(得分:5)
恕我直言Tcl最大的隐藏功能是它的C API.使用它,包装核心C程序或子系统并在Tcl中编写GUI或其他功能非常容易。虽然此功能并非Tcl独有,但Tcl旨在从头开始实现这一功能,而C API特别易于使用。
第二个最重要的隐藏功能是packer,即所有几何管理者的祖父。有了这个,GUI可以拥有相当大的代码量相当大的窗口。值得注意的是,Tcl / Tk至少在10年前才进行了几何管理.net出现了。
Tcl的第三个最大特点是能够通过C API或Tcl中定义的命令来执行语言。不是LISP宏,但相当灵活。 Expect是一个非常好的应用程序示例,它围绕扩展基础Tcl语言来构建特定于域的脚本语言。
编辑:好吧,开玩笑我,Xt really did have a geometry manager,虽然我同意Nat的意见,因为它比打包更痛苦; - }
答案 8 :(得分:5)
[array names]
是新手询问如何迭代数组的第一个问题foreach {key1 key2} {$list1 $list2} {...}
- 即使列表大小不同rename
命令可以重命名任何函数/ proc 答案 9 :(得分:5)
我认为time命令很精彩。它并没有被完全隐藏,但这并不能阻止人们在comp.lang.tcl中偶尔询问“哪个函数更快”。
任何时候你想知道“这需要多长时间?”或“哪种方法更快?”你只需通过“时间”命令调用它。没有创建对象,没有数学,没有开销,非常简单。其他语言有类似的功能,虽然有些不太优雅。
答案 10 :(得分:2)
详细记录的C API也允许在Perl中轻松集成。我对Tcl / Tk的经历可以追溯到1995年,但在2000年左右,我发现了Perl / Tk并且从未回头。
最近,Tcl和Tkx Perl软件包为我们提供了现代化的GUI。上述两个模块虽然不是微不足道的,但涉及的代码相对较少,考虑到它们允许跨越语言边界做什么。这可以直接归因于优秀的API(显然是Perl的强大功能)。