2015-11-17 60 views
2

我可能在这里丢失了一些明显的东西,但也许你可以帮助我。无法在TCL中调用proc无效的命令名称

我有一个tcl脚本。这是全部:

puts [encodeSDR 25] 

proc encodeSDR {input} { 
    set sdr "test" 

    return $sdr 
} 

当我运行该脚本,我得到一个错误:

c:\temp>tclsh testenviro.tcl 
invalid command name "encodeSDR" 
    while executing 
"encodeSDR" 
    invoke from within 
"puts [encodeSDR 25]" 
    (file "testenviro.tcl" line 1) 

我缺少什么?似乎这应该完美。

PS。发现可能的原因:

有当我把放称它为工作的PROC下面 - 因此它不是第一次加载整个脚本?似乎很奇怪,如果是这样的话,但也许就是这样。

+1

程序中的代码可以是字节码编译的,但“全局”级别的代码仍然可以解释。意识到'proc'只是一个常规命令,结果并不令人惊讶。我经常把所有“全局”代码放在一个'main'进程中,然后唯一的“全局”命令就是调用'main'。 –

回答

3

你是正确的,因为在执行任何执行之前,整个脚本没有被加载。 TCL脚本一次解释一个命令,然后只有在完成后才会移动到下一个命令。事先没有编译来检查下面可能引用的过程。

对你来说,它首先试图解释puts命令,其中涉及调用encodeSDR。既然这还没有在内存中定义,解释者不知道你在做什么。

有一点需要注意的是,如果你由其自身确定的程序(比如测试/调试期间),再后来把它添加到一个脚本像你的榜样的方式。它会工作得很好,直到你关闭会话,并且TCL的内存被释放。但是,下次加载脚本时,脚本将失败,因为该过程从未加载过该会话。

+0

您可以随时创建一个'proc main {} ...',然后从脚本底部调用它。 –

相关问题