如何在proc中获取内容?

时间:2013-07-01 14:53:50

标签: tcl

有一个代码用一个proc生成文件:

puts $fh "proc generate \{ fileName\} \{"
puts $fh "[info body generateScriptBody]"
puts $fh "\}"
puts $fh "generate"
close $fh

proc generateScriptBody{} {
    source something1    
    source something2 
    ...
} 

在这种情况下我应该在proc source内还是有替代方案?

2 个答案:

答案 0 :(得分:2)

我不明白你要做什么,但是proc中的来源是可以接受的。如果您希望将整个proc写入文件,请查看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

在这种情况下,我取消了所有source命令,并将内容直接读入proc的主体。

答案 1 :(得分:0)

我刚刚在 proc 中调用 source 时遇到问题,也许对某人有帮助。

我有两个测试文件。这是 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

直接使用 source 一切正常,使用 mysource_right,两种情况下的输出都是:

sourcetest1.tcl
sourcetest2.tcl
outside: 1 2 3
doit: 1 2 3

但是,使用 mysource_wrong,我们得到以下输出:

sourcetest1.tcl
sourcetest2.tcl
outside: 1 2 3
can't read "l": no such variable
    while executing
"puts "doit: $l""
    (procedure "doit" line 3)
    invoked from within
"doit"
    (file "sourcetest2.tcl" line 12)
    invoked from within
"source $script"
    (procedure "mysource_wrong" line 2)
    invoked from within
"mysource_wrong sourcetest2.tcl"
    (file "sourcetest1.tcl" line 13)

我的解释是 source 中的 proc 将变量 l 放入 proc 的范围内,而不是放入全局范围内。这可以通过在 uplevel 中使用 mysource_right 来避免。