嵌入式Tcl:Tcl是否自动完成命令?

阿德里安·米恰克(AdrianMichałek)

我们C / C ++应用程序中内置了一个Tcl ,我在代码中找到了一个地方,如果找不到该命令则会调用Tcl_EvalObjv我必须承认代码很老,而且我们的开发人员中很少有人知道此模块中发生了什么。

看起来像这样:

// ... there is some checking if command is registered etc., it fails and the code goes here:
std::vector<Tcl_Obj*> tclArgs = { NULL };
for (int i = 1; i < objc; ++i)
    tclArgs.push_back(objv[i]);
tclArgs.shrink_to_fit();
// ...
tclArgs[0] = ::Tcl_NewStringObj(ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN_SIZE);
Tcl_IncrRefCount(tclArgs[0]);
::Tcl_ExposeCommand(pInterp, ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN);
result = ::Tcl_EvalObjv(pInterp, objc, &tclArgs[0], TCL_EVAL_GLOBAL); //<--
::Tcl_HideCommand(pInterp, ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN);
// ORIGINAL_UNKNOWN is char* it is just "unknown"

我们的应用程序中有命令处理程序,而CmdUnknown()函数中执行Tcl_EvalObjv时Tcl有时会调用不同的命令。下面的例子:

现有命令列表:“香蕉”,“小苹果”,“地毯”,“卡”

命令:“ apple”,Tcl调用“ applepie”(错误,“ apple”不是“ applepie”)
命令:“ blah”,Tcl给出错误(正确)。
命令:“ car”,Tcl给出错误(正确,可能是由于2条相似的命令)。Tcl在搜索命令失败时会

采取某种机制吗?问题是我找不到与可以完成命令的代码相关的任何东西,所以Tcl可以吗?

麦卡文

正如glenn所暗示的那样,交互式(REPL)模式下的Tcl允许使用一些最小但明确的名称前缀来调度命令。我不能说出嵌入式Tcl是如何配置,初始化以及最终以交互方式运行的。但是,您可能想尝试通过以下两种方法之一“关闭”(切换)交互模式:

unset ::tcl_interactive

要么

set ::tcl_interactive 0

所有这些都是由默认unknown处理程序实现的当心cmds是或否时,请注意如何查找清单以及如何区别对待tcl_interactive

puts [info body unknown]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章