源于字符串

时间:2018-11-29 07:38:59

标签: 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的内容读入字符串并提供该字符串的来源。我希望字符串的内容来自同一进程上下文。

像下面一样

//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?

1 个答案:

答案 0 :(得分:2)

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命令是这里的关键:它 eval 在字符串中创建一个Tcl脚本。它在现代Tcl中并不经常使用,但是对于这样的事情,它是首选。


如果将代码放入过程中,则需要将eval的{​​{1}}更改为具有正确的语义; uplevel 1不会不会为您更改堆栈框架:

source