TCL/TK的隐藏特征

joe*_*joe 15 tk-toolkit tcl

我一直在使用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)

  • Stardate时间格式与Sun无关.我在Scriptics工作时将它添加到Tcl,作为即将到来的Tcl2K会议的复活节彩蛋.其中一个会议活动是使用奥术公式实施标准到标准转换实用程序的竞赛.只有一个人参加了这个活动.他花了几个小时为实施工作而苦恼(因为他正在寻找Scriptics的工作,他渴望留下深刻的印象)只是为了让事后的复活节彩蛋显露出来.当然,他无论如何都赢得了比赛.他也得到了这份工作. (25认同)
  • 这是添加的CVS日志:http://tcl.cvs.sourceforge.net/viewvc/tcl/tcl/unix/tclUnixTime.c?view = log#rev1.7"Enterprise"位是关于主题的一个剧本Tcl2K,这是Tcl是唯一的企业友好脚本语言.该手册是故意模糊的,因为它当然是一个复活节彩蛋. (6认同)

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"设置为与正则表达式不匹配的任何内容,则会出现运行时错误.


Col*_*eod 7

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


Nat*_*Nat 7

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

  • TCL可能是一种没有太多命令的简单语言,但它们可以以有趣的方式组合. (2认同)

小智 7

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

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

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


Con*_*lls 5

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

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

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

编辑:嗯,开玩笑我,Xt 确实有一个几何管理器,虽然我同意Nat,因为它比打包更痛苦; - }

  • 令人惊讶的是,在打包和网格几何管理器之间,可以解决超过99%的布局问题,并且只需很少的代码行.相比之下,像wxWidgets这样的工具包需要至少四个几何管理器来完成相同的工作:GridSizer,FlexGridSizer,BoxSizer和StaticBoxSizer.另外,盒子大小调整器并不像打包器那么强大,所以你通常需要使用一个用于水平布局,一个用于垂直布局,这是打包器处理的一种方式. (6认同)

Nir*_*evy 5

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

  • 最后一个是给予 Tcl 程序员如此大的灵活性的一部分。有多少其他语言让您重新定义“如果”或“返回”?虽然您需要重命名核心命令的情况非常非常罕见,但一旦您这样做,您就会感到非常高兴。 (2认同)

Bry*_*ley 5

我认为时间命令很精彩.它并没有被完全隐藏,但这并不能阻止人们在comp.lang.tcl中偶尔询问"哪个函数更快".

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