Tcl 如何在proc内部找到源代码?
有一个代码通过一个过程生成文件:Tcl 如何在proc内部找到源代码?,tcl,Tcl,有一个代码通过一个过程生成文件: puts $fh "proc generate \{ fileName\} \{" puts $fh "[info body generateScriptBody]" puts $fh "\}" puts $fh "generate" close $fh proc generateScriptBody{} { source something1 source something2 ... } 在这种情况下,我应该sourc
puts $fh "proc generate \{ fileName\} \{"
puts $fh "[info body generateScriptBody]"
puts $fh "\}"
puts $fh "generate"
close $fh
proc generateScriptBody{} {
source something1
source something2
...
}
在这种情况下,我应该
source
在proc内部还是有其他选择?我不明白您试图做什么,但proc内部的source是可以接受的。如果您希望将整个过程写入一个文件,请查看TclX包中的saveprocs
;这将有助于简化您的代码
更新
下面是使用saveprocs
的示例:
package require Tclx
# Generate a proc from body of one or more files
set body [read_file something1]
append body "\n" [read_file something2]
proc generate {fileName} $body
# Write to file
saveprocs generate.tcl generate
在本例中,我删除了所有的
源代码
命令,并将内容直接读取到进程的主体中。我只是在进程内部调用源代码时遇到了一个问题,可能这对某些人有帮助
我有两个测试文件。这是sourcetest1.tcl
,它以三种不同的方式来源sourcetest2.tcl
:
puts "sourcetest1.tcl"
proc mysource_wrong {script} {
source $script
}
proc mysource_right {script} {
uplevel "source sourcetest2.tcl"
}
#source sourcetest2.tcl
#mysource_right sourcetest2.tcl
mysource_wrong sourcetest2.tcl
这是sourcetest2.tcl
:
puts "sourcetest2.tcl"
set l {1 2 3}
puts "outside: $l"
proc doit {} {
global l
puts "doit: $l"
}
doit
使用直接源代码
和mysource\u right
时一切正常,两种情况下的输出都是:
sourcetest1.tcl
sourcetest2.tcl
室外:1 2 3
doit:123
但是,如果mysource\u错误
,我们会得到以下输出:
sourcetest1.tcl
sourcetest2.tcl
室外:1 2 3
无法读取“l”:没有此类变量
执行时
放置“doit:$l”
(程序“doit”第3行)
从内部调用
“doit”
(文件“sourcetest2.tcl”第12行)
从内部调用
“源$script”
(程序“mysource_错误”第2行)
从内部调用
“mysource\u错误的sourcetest2.tcl”
(文件“sourcetest1.tcl”第13行)
我的解释是
proc
中的source
将变量l
放入proc
的范围,而不是全局范围。这可以通过使用uplevel
来避免,就像在mysource\u right
中一样,该代码是否有效?将源代码放入进程中没有问题。没有问题。我只是想知道在proc内部进行源码是不是一种好的做法