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内部进行源码是不是一种好的做法