c++ - 嵌入式 Tcl:Tcl 是否自动完成命令?
问题描述
我们在 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有时会调用不同的命令。以下示例:
现有命令列表:“banana”、“applepie”、“carpet”、“card”
命令:“apple”,Tcl 调用“applepie”(错误,“apple”不是“applepie”)
命令:“blah”,Tcl 给出错误(正确)。
命令:“汽车”,Tcl 给出错误(正确,可能是因为 2 个类似的命令)。当Tcl搜索命令失败时,
是否有某种机制?问题是我找不到任何与我们的代码相关的东西来完成命令,所以Tcl可以吗?
解决方案
正如 glenn 所暗示的那样,交互式 (REPL) 模式下的 Tcl允许使用一些最小但明确的名称前缀来调度命令。我无法说出您的嵌入式 Tcl 是如何配置、初始化并最终以交互模式运行的。但是,您可能想尝试通过以下任一方式“关闭”(切换)交互模式:
unset ::tcl_interactive
或者
set ::tcl_interactive 0
所有这些都是由默认unknown
处理程序实现的。注意列表的查找方式以及当为真或假cmds
时如何区别对待:tcl_interactive
puts [info body unknown]
推荐阅读
- c++ - Plus operator on strings in c++
- hibernate - Hibernate Session Factory 的创建成本很高
- oracle - 如果第一个条件匹配,PLSQL 过程返回真
- reactjs - redux更新后如何更新useRef
- java - 如何在 Spring Boot 应用程序中执行“pg_advisory_lock”?
- spring - ParameterizedTypeReference 用法
- pandas - 在 Databricks DBFS 中保存数据帧字典
- php - 未定义变量:worklogs_yesterday(查看:/home/riwaj/Desktop/projects/dmt-intern-manager/InternManager/resources/views/home.blade.php)
- wpf - 自定义 DatagridTemplateColumn 按钮 - 将按钮内容绑定到自定义列属性
- r - 根据 data.table 中的列列表过滤条件