启动 tcl 并复制当前环境

Start a tcl and copy the current environment

提问人:piper 提问时间:11/16/2023 更新时间:11/16/2023 访问量:55

问:

在执行 tcl 脚本时,通常需要打印一些结果以确保过程正确,这意味着需要在脚本中编写一些放。

有没有办法在 tcl 脚本执行时启动另一个 tclsh 并复制当前环境,并在新的 tclsh 中多次测试,而不会影响运行脚本的 tclsh。

TCLTCL 公司

评论

0赞 piper 11/16/2023
或者是否可以使用一些现有的 api 在 c 代码中实现它。

答:

0赞 Shawn 11/16/2023 #1

您可以创建一个新的 reter,提供所需的所有需要的进程、变量等(或其中的脚本),并在其中运行代码。销毁它,并根据需要多次重复新的。这个想法的快速而肮脏的例子:interpsource

#!/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 commandsinfo vars
0赞 Cyan Ogilvie 11/16/2023
这种方法本质上是标准包的命令所做的事情,但更完整的是,我不建议尝试临时这样做,有一百万件事情需要处理(命名空间、interp 别名、加载的包)。或者(如果你在 unix 上)我想你可以这个过程,但线程会中断,就像在分叉后共享的其他状态(如一些文件句柄等)一样ttraceThreadfork
0赞 Shawn 11/17/2023
@CyanOgilvie是的,对于任何复杂的事情,我建议有一个脚本来完成所有设置和定义,然后可以将其放入新的 interp 中。source