嵌入式 Tcl:Tcl 会自动完成命令吗?

Embedded Tcl: Does Tcl autocomplete commands?

我们有一个 Tcl 内置 我们的 C/C++ 应用程序,我在我们的代码中找到了 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 有时会调用不同的命令。以下示例:

现有命令列表:"banana"、"applepie"、"carpet"、"card"

命令:"apple",Tcl调用"applepie"(错误,"apple"不是"applepie")
命令:"blah",Tcl 给出错误(正确)。
命令:"car",Tcl 给出错误(正确,可能是因为 2 个类似的命令)。

Tcl 在搜索命令失败时是否有某种机制?问题是我找不到任何与我们的代码相关的东西来完成命令所以也许 Tcl 可以?

正如 glenn 所暗示的,interactive (REPL) mode 中的 Tcl 允许使用一些最小但明确的名称前缀来调度命令。我不知道您的嵌入式 Tcl 是如何配置、初始化并最终成为 运行 的,就像在交互模式下一样。但是,您可能想尝试 "turn off"(切换)交互模式,方法是:

unset ::tcl_interactive

set ::tcl_interactive 0

所有这些都是由默认的 unknown 处理程序实现的。注意 cmds 的列表是如何查找的,以及当 tcl_interactive 为真或假时如何区别对待它:

puts [info body unknown]