Tcl 来源于字符串

Tcl 来源于字符串,tcl,Tcl,如何从字符串而不是文件中获取源 这就是我们通常的文件来源 // somename.tcl proc someName {} { # The {} above means a list of zero formal arguments puts "Hello from inside someName" } 我可以通过以下方式从任何其他tcl文件中获取此信息 //main.tcl source "somename.tcl" //call someName someName 我

如何从字符串而不是文件中获取源

这就是我们通常的文件来源

// somename.tcl
proc someName {} {
    # The {} above means a list of zero formal arguments
    puts "Hello from inside someName"
}
我可以通过以下方式从任何其他tcl文件中获取此信息

//main.tcl
source "somename.tcl"

//call someName 
someName
我希望将somename.tcl的内容读入字符串并作为字符串的源代码,而不是上述内容。我希望字符串的内容来源于相同的流程上下文

如下

//main.tcl 
set filename "somename.tcl" 
set f [open $filename] 
set content [read $f]

# I want to source the content here
#How do i do it?

source
命令在内部执行类似的操作:

# Reading phase
set f [open $filename]
try {
    fconfigure $f -encoding $encoding -eofchar "\032"
    set contents [read $f]
} finally {
    close $f
}

# Evaluation phase
set oldScript [info script]
try {
    info script $filename
    eval $contents
} finally {
    info script $oldScript
}
其中
$encoding
默认为
[encoding system]
报告的内容。除了在C语言中这样做,并且对于简单的参数解析有一些额外的复杂性,并且在堆栈跟踪方面有一些不同的错误处理

在简单的情况下,您可以将其转换为:

set f [open $filename]
set contents [read $f]
close $f
eval $contents
eval
命令是这里的关键:它计算字符串中的Tcl脚本。它在现代Tcl中并不经常使用,但对于类似的东西来说,它是首选的命令


如果将代码放入过程中,则需要更改
uplevel1
eval
,以获得正确的语义<代码>源代码不会更改堆栈帧:

proc simpleSource {filename} {
    set f [open $filename]
    set contents [read $f]
    close $f

    uplevel 1 $contents
}
?