我一直在使用TCL/TK,最近开始使用TCL/TK和我的自动化应用程序,我渴望知识.
要继续使用长长的隐藏特征问题,我想知道TCL/TK的任何隐藏或方便的功能或任何简单的方法来实现一些大的操作
Bry*_*ley 16
我最喜欢的"隐藏或方便的功能"是引用如何在Tcl中工作.我喜欢使用短语" 引用是一种工具,而非规则 ".我还想说" 当你需要花括号时你只需要花括号 "
虽然大多数语言都有规则,必须为某些事物使用块分隔符(例如,在C中你必须使用{}来指定一个块),但Tcl并不是那么严格.
使用Tcl,您可以选择任何引用字符为您提供所需的效果.肯定有最好的做法,但最后你可以选择最能让你完成工作的引用字符.
这意味着,例如,您可以通过多种方式定义过程,包括:
proc foo {args} {
.... body here ....
}
proc foo "args" "
.... body here ....
"
proc foo args [some code that returns the body]
Run Code Online (Sandbox Code Playgroud)
... 等等.条件语句,循环和其他所有内容也是如此.(对于不熟悉的,花括号大致相当于shell单引号,双引号就像shell双引号,方括号就像shell反引号一样.).
现在,很多人都在看这个并说出WTF?但它确实给程序员带来了很大的力量.我们经常在comp.lang.tcl中遇到"如果我这样做{和$那个}"的问题,我如何得到$那个要扩展的?" 答案是老笑话"患者:医生,我做这个医生时疼痛:不要这样做".也就是说,如果您不喜欢使用一组分隔符获得的行为,请选择其他分隔符.仅仅因为if语句通常用花括号构造并不意味着它必须用花括号构造.
这是我最喜欢的Tcl隐藏功能.它并没有被隐藏 - 它在完美而简洁的Tcl(n)手册页上是正确的,但是直到你完全了解Tcl是如何工作的,其后果尚不清楚.
Col*_*eod 14
当Sun的营销人员宣称Tcl是"企业就绪"时,开发人员添加了以下功能:
$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2
Run Code Online (Sandbox Code Playgroud)
Col*_*eod 12
另一个非显而易见的特性是无法识别的命令落入称为"未知"的处理程序,您可以重新定义.例如.将未知命令视为要评估的表达式:
$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]}
% 2+2
4
Run Code Online (Sandbox Code Playgroud)
更多示例可以在激进语言修改的维基页面上找到
小智 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]+$}]`
Run Code Online (Sandbox Code Playgroud)
如果您尝试将"myvar"设置为与正则表达式不匹配的任何内容,则会出现运行时错误.
小智 7
所有Tcl的"关键字"都是常规的Tcl命令,包括[for],[foreach],[while]等控制结构.这意味着您可以通过在纯Tcl代码中编写新的控制结构来扩展语言.
例如,try/on/trap结构已在Tcl 8.6a中仅使用Tcl代码实现.类似地,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,因为它比打包更痛苦; - }
[array names]
是新手询问如何迭代数组的第一个问题之一foreach {key1 key2} {$list1 $list2} {...}
- 即使列表大小不同rename
命令可以重命名任何函数/ proc