奇怪的TCL怪癖

时间:2010-10-14 00:38:25

标签: tcl interpreter procedure externals

所以我对TCL编程的方式非常新,缺乏经验。我写了一个脚本,调用别人写的proc,首先删除输出文件。然后它做了我写的一些额外的逻辑。

我将逻辑移动到第二个过程中,并立即将其中的一大部分打破(即rm命令)。

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

有人可以向我解释为什么TCL会这样做吗?

e.g。

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的程序,后者具有自己内置的TCL行为。也许在您的回复中,您可以指出这是否也是其他口译员的标准?

2 个答案:

答案 0 :(得分:5)

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

我无法看到tclsh手册页中记录了这一点,但unknown手册页确实记录了这一点。另请参阅Tcl wiki上的tclsh页面。在交互式tclsh会话中,您可以通过键入以下内容来查看unknown的功能:

info body unknown

[更新]

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

  

unknown命令提供了一些其他便利。这些仅在您直接键入命令时使用。一旦执行进入过程或者未以交互方式使用Tcl shell,它们将被禁用。便利功能是程序的自动执行,命令历史记录和命令缩写。如果无法从脚本库加载命令实现,则按顺序尝试这些选项。

答案 1 :(得分:2)

注意,这也是可编程测试的,通过变量 tcl_interactive ,如果Tcl是通过交互式shell运行则为“1”,否则为“0”。该变量也是可设置的,因此可以启动交互式shell,然后 [set tcl_interactive 0] ,然后继续。此时,丢失了

  • 命令提示符
  • proc名称/命令名称完成等功能(即:无法输入 [pu“xyz”] 并获得键入 [puts“xyz”] 的效果,就像交互式shell一样)
  • 自动“shell-out”外部命令完成一个请求(如原始问题中的“rm”)
  • 以及其他人......

  • 相关问题