我正在编写一个c ++代码来评估tcl proc。我有两个TCL文件。两个中的任何一个都可以有tcl proc 说file1.tcl有tcl proc mytest。 file2.tcl正在获取file1.tcl,所以如果我在file2.tcl中执行[info procs mytest],我可以获得tcl proc名称mytest。 但是在c ++中,当我尝试评估proc时,它表示无效命令mytest。 但是如果我在file2.tcl中编写proc mytest,它就可以工作。
file1.tcl是用户输入,file2.tcl是默认输入。只有在file1.tcl中缺少proc,我才会调用file2.tcl proc。 请建议我如何才能使它发挥作用。
由于 Ruchi
答案 0 :(得分:1)
您的问题并不完全清楚,但似乎您有两个文件,其中一个是您控制的(哪些提供了某些Tcl命令的默认实现?)而另一个文件是由您的用户控制的(所以它们可以覆盖的东西?)。然后,您想将这些加载到Tcl解释器上下文中,以便您可以从C ++调用内容?我会假设这是正在发生的事情。
首先,从Tcl的角度来看,您可以通过使用默认实现获取文件的上下文(Tcl_Interp*
)到source
来实现此目的。 (还有其他方法可以做到这一点,但这绝对是最简单的。)只有在完成之后你才会source
带有用户定义的文件,你只能在之后进行调用。一切已正确完成采购。这就是我们的目标。
从C ++开始,需要注意的主要事项是Tcl_EvalFile()
相当于Tcl中的source
(正如Tcl_Eval()
相当于eval
),你有小心检查错误; Tcl根本不会将其异常系统映射到C ++异常,因此 检查这些返回代码 。
Tcl_Interp *interp = Tcl_CreateInterp();
if (Tcl_EvalFile(interp, "file2.tcl") != TCL_OK) {
const char *errorMessage = Tcl_GetString(Tcl_GetObjResult(interp));
// Deal with error
cerr << "Problem in library: " << errorMessage << "\n";
exit(1);
}
if (Tcl_EvalFile(interp, "file1.tcl") != TCL_OK) {
const char *errorMessage = Tcl_GetString(Tcl_GetObjResult(interp));
cerr << "Problem in user code: " << errorMessage << "\n";
exit(1);
}
// Everything ready
if (Tcl_Eval(interp, "[the_party get] start") != TCL_OK) {
// Something still went wrong...