提问人:piper 提问时间:11/16/2023 更新时间:11/16/2023 访问量:55
启动 tcl 并复制当前环境
Start a tcl and copy the current environment
问:
在执行 tcl 脚本时,通常需要打印一些结果以确保过程正确,这意味着需要在脚本中编写一些放。
有没有办法在 tcl 脚本执行时启动另一个 tclsh 并复制当前环境,并在新的 tclsh 中多次测试,而不会影响运行脚本的 tclsh。
答:
0赞
Shawn
11/16/2023
#1
您可以创建一个新的 reter,提供所需的所有需要的进程、变量等(或其中的脚本),并在其中运行代码。销毁它,并根据需要多次重复新的。这个想法的快速而肮脏的例子:interp
source
#!/usr/bin/env tclsh
# Import a user-defined proc into the given interpreter
proc importProc {interp procName} {
$interp eval [list proc $procName [info args $procName] [info body $procName]]
}
# Import the variable into the given interpreter.
# Name should be fully qualified; ::x not x for global variables
proc importVar {interp name} {
$interp eval [list set $name [set $name]]
}
proc buildDemo {} {
set i [interp create]
importProc $i example
importVar $i ::foo
return $i
}
set foo bar
proc example {} {
global foo
puts "Example: $foo"
}
set i [buildDemo]
set foo baz
$i eval example ;# prints bar
interp delete $i
评论
0赞
piper
11/16/2023
看起来我仍然需要手动复制我的数据,但是当我的环境特别复杂时,是否可以快速复制 interp,然后在新的 tclsh 中调试它?
0赞
Shawn
11/16/2023
@piper 您可以使用 和 自动执行它,但如果您加载任何包或使用命名空间,它可能会变得混乱。info commands
info vars
0赞
Cyan Ogilvie
11/16/2023
这种方法本质上是标准包的命令所做的事情,但更完整的是,我不建议尝试临时这样做,有一百万件事情需要处理(命名空间、interp 别名、加载的包)。或者(如果你在 unix 上)我想你可以这个过程,但线程会中断,就像在分叉后共享的其他状态(如一些文件句柄等)一样ttrace
Thread
fork
0赞
Shawn
11/17/2023
@CyanOgilvie是的,对于任何复杂的事情,我建议有一个脚本来完成所有设置和定义,然后可以将其放入新的 interp 中。source
评论