怪异的TCL怪癖

怪异的TCL怪癖,tcl,interpreter,procedure,externals,Tcl,Interpreter,Procedure,Externals,所以我对TCL编程的方式很陌生,也没有经验。我编写了一个脚本,调用其他人编写的进程,首先删除输出文件。然后它执行我编写的一些附加逻辑 我将逻辑移到第二个过程中,立即有一堆逻辑中断,即rm命令 据我所知,中央执行程序中一行上的第一个程序(proc定义后面的文本)在没有exec命令的情况下正常执行。但是,如果您将其移动到proc中,它现在需要一个exec命令 有谁能解释一下TCL为什么会这样做 e、 g *注意,这种奇怪的行为可能特定于我将脚本提供给vmd的程序,它有自己的内置TCL行为。也许

所以我对TCL编程的方式很陌生,也没有经验。我编写了一个脚本,调用其他人编写的进程,首先删除输出文件。然后它执行我编写的一些附加逻辑

我将逻辑移到第二个过程中,立即有一堆逻辑中断,即rm命令

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

有谁能解释一下TCL为什么会这样做

e、 g

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

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

我看不到手册页中有记录,但手册页有记录。另请参见Tcl wiki上的页面。在交互式tclsh会话中,您可以通过键入以下内容查看unknown的功能:

info body unknown
[更新]

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

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

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

我看不到手册页中有记录,但手册页有记录。另请参见Tcl wiki上的页面。在交互式tclsh会话中,您可以通过键入以下内容查看unknown的功能:

info body unknown
[更新]

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

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


注意,这也是可以通过变量tcl_interactive进行编程测试的,如果tcl是通过交互式shell运行的,则为1;如果不是,则为0。该变量也是可设置的,因此可以启动一个交互式shell,然后[set tcl_interactive 0],然后继续。此时,您将丢失%command Promp proc name/命令名completion等功能,即:无法键入[pu xyz]并获得键入[puts xyz]的效果,与交互式shell类似,Automatic shell out让外部命令完成请求,如原始问题中的rm,或者其他…

注意,这也是可以通过变量tcl_interactive进行编程测试的,如果tcl通过交互式shell运行,则为1,如果不是,则为0。该变量也是可设置的,因此可以启动一个交互式shell,然后[set tcl_interactive 0],然后继续。此时,您将丢失%command Promp proc name/命令名completion等功能,即:无法键入[pu xyz]并获得键入[puts xyz]的效果,就像一个交互式shell自动shell,让外部命令完成一个请求,就像这个原始问题中的rm,也许还有其他…

文件删除比exec rm更可取…是的,我把我所有的语句都换成了这个,以便更具tcl风格。我总是尝试使用脚本语言的内置功能,而不是普通的外部程序,尽管通常有很多方法来剥这只隐喻性的猫的皮。这似乎是一个好主意,因为它将使代码更少依赖于平台/发行版。文件删除比exec rm更可取……是的,我将所有语句都改为更依赖于tcl。我总是尝试使用脚本语言的内置功能,而不是普通的外部程序,尽管通常有很多方法来剥这只隐喻性的猫的皮。这似乎是一个好主意,因为它将使代码不再依赖于平台/发行版。考虑到这种行为似乎是个坏主意,这是令人惊讶的。如果我在编写tclsh/tcl解释器,我总是需要一个exec语句来保持一致性。有时,允许它似乎是一种灾难,特别是考虑到脚本语言的多样性意味着许多用x语言编写的人并不熟悉它的所有复杂之处。任何TCL老兵
但是有什么可以解释为什么使用这种方法呢?我想这些特性是为了使交互式Tcl会话的行为更像unix shell而添加的。Tcl是作为一种粘合语言编写的,与unix shell非常相似,它易于执行外部命令。考虑到命令历史是如何工作的,也许Ousterhout博士或早期的Tcl开发人员之一是csh迷^旧的^新的,etcI我相信这属于它的范畴,在当时似乎是个好主意。如果没有使用该名称的过程,Tcsh确实更喜欢自动运行外部命令。至于为什么它只在顶层工作,正如glenn所提到的,未知中还内置了一些其他方便的功能,包括命令历史记录,您可能永远无法在脚本中可靠地使用这些功能。Tcl最初不是作为粘合语言编写的。它是作为命令语言编写的,意思是:一个shell。因此它的名字是:Tool Command Language意思是:工具的外壳,这里的工具指的是CAD程序或任何其他用C语言编写的可执行程序。Ousterhout一开始对人们使用他的语言编写大型程序(如运行海上石油钻井平台的程序)感到非常惊讶。有趣。考虑到这种行为似乎是个坏主意,这是令人惊讶的。如果我在编写tclsh/tcl解释器,我总是需要一个exec语句来保持一致性。有时,允许它似乎是一种灾难,特别是考虑到脚本语言的多样性意味着许多用x语言编写的人并不熟悉它的所有复杂之处。有没有TCL老手能为使用这种方法辩护?我想这些功能的加入是为了使交互式TCL会话的行为更像unix shell。Tcl是作为一种粘合语言编写的,与unix shell非常相似,它易于执行外部命令。考虑到命令历史是如何工作的,也许Ousterhout博士或早期的Tcl开发人员之一是csh迷^旧的^新的,etcI我相信这属于它的范畴,在当时似乎是个好主意。如果没有使用该名称的过程,Tcsh确实更喜欢自动运行外部命令。至于为什么它只在顶层工作,正如glenn所提到的,未知中还内置了一些其他方便的功能,包括命令历史记录,您可能永远无法在脚本中可靠地使用这些功能。Tcl最初不是作为粘合语言编写的。它是作为命令语言编写的,意思是:一个shell。因此它的名字是:Tool Command Language意思是:工具的外壳,这里的工具指的是CAD程序或任何其他用C语言编写的可执行程序。Ousterhout一开始对人们使用他的语言编写大型程序(如运行海上石油钻井平台的程序)感到非常惊讶。
proc helloworld {} {
  #works
  eval rm my_file 
  puts "hi"
}
helloworld
proc helloworld {} {
  #works
  file delete my_file 
  puts "hi"
}
helloworld
info body unknown