代码之家  ›  专栏  ›  技术社区  ›  derigel

tcl/tk的隐藏特性[关闭]

  •  15
  • derigel  · 技术社区  · 5 年前

    我一直在和tcl/tk合作,最近开始在我的自动化应用程序中使用tcl/tk,我渴望获得知识。

    为了继续深入研究隐藏的特性问题,我想知道Tcl/Tk的任何隐藏的或方便的特性,或者实现某些大型操作的任何简单方法。

    11 回复  |  直到 12 年前
        1
  •  14
  •   Colin Macleod    15 年前

    当Sun的一位营销人员宣布TCL“企业就绪”时,开发人员添加了以下功能:

    $ tclsh
    % clock format [clock seconds] -format %Q
    Stardate 63473.2
    
        2
  •  16
  •   Bryan Oakley    15 年前

    我最喜欢的“隐藏或方便的特性”是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中,我们经常会遇到这样的问题:“如果我做‘这和$that’,我如何获得要扩展的$that?”答案是这样的:“病人:医生,当我做这个医生时很疼:不要做那个”。也就是说,如果您不喜欢使用一组分隔符所得到的行为,请选择其他一些分隔符。仅仅因为if语句通常用大括号构造并不意味着 必须 用大括号构造。

    这是我最喜欢的TCL“隐藏”功能。它并不是隐藏的——它就在TCL(n)的完美而简洁的手册页上,但是直到你完全摸索TCL是如何工作的,后果才清楚。

        3
  •  12
  •   Colin Macleod    15 年前

    另一个不明显的特性是,未识别的命令会落入一个名为“unknown”的处理程序中,您可以重新定义该处理程序。将未知命令作为表达式进行计算:

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

    有关更多示例,请访问wiki页面 Radical Language Modification

        4
  •  12
  •   Donal Fellows    13 年前

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

        5
  •  7
  •   Colin Macleod    15 年前

    对于来自其他语言的人来说,一个不隐藏但不明显的便利特性是,您可以定义自己的控制结构(如果您想危险地生活,甚至可以重新定义现有的控制结构)。有一些关于 Tcl Wiki

        6
  •  7
  •   Nat    15 年前

    TCL是这样一种简单、开放的语言,隐藏的功能很少。这一切都是为了让程序员能够扩展和适应。

        7
  •  7
  •   Twylite    15 年前

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

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

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

        8
  •  5
  •   ConcernedOfTunbridgeWells    15 年前

    imho TCL最大的隐藏特征是 C API. 使用它,很容易包装一个核心C程序或子系统,并在TCL中编写一个GUI或其他功能。虽然这一特性不是TCL独有的,但TCL的设计初衷是这样的,C API特别容易使用。

    第二大隐藏特征是 packer 是所有几何管理者的父亲。有了这个,图形用户界面就可以拥有相当大的窗口,而且代码数量非常少。值得注意的是,tcl/tk在.net问世至少10年前就进行了几何管理。

    Tcl的第三大特点是能够通过C API或Tcl中定义的命令来执行语言。虽然不是非常lisp宏,但仍然非常灵活。 Expect 是围绕扩展basse tcl语言以生成特定于域的脚本语言而构建的应用程序的一个很好的例子。

    编辑: 嗯,打扰我,xt really did have a geometry manager 虽然我同意Nat的观点,但它比pack更痛苦;-

        9
  •  5
  •   Nir Levy    15 年前
    1. [array names] 新手问的第一个问题是如何迭代数组
    2. 还有,你可以 foreach {key1 key2} {$list1 $list2} {...} -即使列表大小不同
    3. 您不应该在切换案例之间使用注释(这不是一个很酷的特性,但大多数开发人员不理解这一问题
    4. 这个 rename 命令可以重命名任何函数/proc
        10
  •  5
  •   Bryan Oakley    15 年前

    我认为 time 指挥棒极了。在comp.lang.tcl中,它并不是完全隐藏的,但这并不能阻止人们偶尔询问“哪个功能更快”。

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

        11
  •  2
  •   xcramps    15 年前

    文档良好的C API还允许在Perl中轻松集成。我对tcl/tk的经验可以追溯到1995年,但在2000年左右的时间里,我发现了perl/tk,从此再也没有回头过。

    最近,tcl和tkx-perl包给了我们现代的图形用户界面,而前面提到的两个模块虽然不简单,但涉及的代码相对较少,考虑到它们允许跨语言边界执行什么操作。这可以直接归因于出色的API(显然还有Perl的强大功能)。