代码之家  ›  专栏  ›  技术社区  ›  Jason R. Mick

怪异的TCL怪癖

  •  1
  • Jason R. Mick  · 技术社区  · 14 年前

    因此,我对TCL编程的方法非常陌生和缺乏经验。我编写了一个脚本,调用其他人编写的过程,首先删除输出文件。然后它做了一些我写的附加逻辑。

    我把逻辑转移到第二个过程中,立即有一堆逻辑中断了(即rm命令)。

    据我所知,在中央执行(proc definitions后面的文本)的一行中,第一个程序在没有“exec”命令的情况下正常执行。但是,如果您在一个过程中移动它,它现在需要一个“exec”命令。

    有人能给我解释一下为什么TCL会这样做吗?

    例如

    proc helloworld {} {
      puts "hi"
    }
    #works
    rm my_file 
    helloworld
    

    proc helloworld {} {
      #doesn't work
      rm my_file 
      puts "hi"
    }
    helloworld
    

    proc helloworld {} {
      #works
      eval rm my_file 
      puts "hi"
    }
    helloworld
    

    proc helloworld {} {
      #works
      file delete my_file 
      puts "hi"
    }
    helloworld
    

    *注意,这种奇怪的行为可能是特定于我将脚本提供给vmd的程序,vmd有自己内置的tcl行为。也许在你的回答中,你可以指出这是否也是其他口译员的标准?

    2 回复  |  直到 14 年前
        1
  •  5
  •   glenn jackman    14 年前

    互动式 tclsh会话将尝试 exec 未知命令(例如 rm )在非交互式脚本执行中或在procs中(如您所发现的那样),您不能指望这种行为。

    我看不到这是在 tclsh 手册页,但是 unknown 手册页有。也见 tclsh tcl wiki上的页面。在交互式tclsh会话中,您可以看到 unknown 打字:

    info body unknown
    

    [更新]

    引用“Tcl和Tk中的实际编程”:

    这个 未知的 命令提供了一些其他便利。这些仅在直接键入命令时使用。一旦执行进入一个过程或者tcl shell没有被交互使用,它们就会被禁用。方便的功能是自动执行程序、命令历史和命令缩写。如果无法从脚本库加载命令实现,则依次尝试这些选项。

        2
  •  2
  •   bch    14 年前

    注意,这也是可编程测试的,通过变量 TCL交互 如果TCL是通过交互式shell运行的,则为“1”;如果不是,则为“0”。变量也是可设置的,因此可以启动一个交互式shell,然后 [设置tcl_interactive 0] ,然后继续。在这一点上,我们失去了这样的特性

  • 这个 % 命令提示符
  • proc name/命令名完成(即:无法键入 [PU“XYZ”] 得到打字的效果 [放置“XYZ”] 就像一个互动的外壳)
  • 自动“shell out”让外部命令完成请求(如原始问题中的“rm”)。
  • 也许其他人…