2014-01-24 34 views
0

我正在编写一个C++代码来评估一个tcl proc。我有两个TCL文件。任何两个可以有tcl proc 说file1.tcl有tcl proc mytest。 file2.tcl源文件file1.tcl所以如果我在[file proc mytest] file2.tcl中,我能够得到tcl proc名称mytest。 但在C++中,当我尝试评估proc时,它说无效的命令mytest。 但是,如果我在file2.tcl中编写proc mytest,它会起作用。需要从C++中的另一个文件调用tcl proc

file1.tcl是用户输入,file2.tcl是默认输入。只有在file1.tcl中缺少proc时,我才会调用file2.tcl proc。 请建议我如何得到它的工作。

感谢 鲁奇

+0

如果您还没有这样做呢,我建议你请阅读[堆栈溢出的问题清单(http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist )。 –

回答

1

你的问题是不完全清楚,但似乎你有两个文件,其中一个可以控制(并提供了一些Tcl的默认实现命令?),而另一个的是由用户控制的(这样他们可以覆盖的东西?)。然后你想把它们加载到Tcl解释器上下文中,以便你可以从C++调用东西?我会认为这是发生了什么事。

首先,从Tcl的角度来看,通过获取上下文(Tcl_Interp*)到source这个文件,使用默认实现。 (还有其他方法可以做到这一点,但这绝对是最简单的方法。)只有在完成之后,您才可以用source这个文件加上用户定义,并且只有在已完成采购正确。所以这就是我们的目标。

从C++,要注意的主要事情是Tcl_EvalFile()source Tcl中(就像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... 
相关问题