У нас есть 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"
У нас есть обработчики для команд в нашемПри выполнении Tcl_EvalObjv в CmdUnknown () функция Tcl иногда вызывает различные команды.Примеры ниже:
Список существующих команд: "banana", "applepie", "carpet", "card"
Команда: "apple", Tcl вызывает "applepie" (неправильно, «яблоко» не является «яблочным пирогом»)
Команда: «бла», Tcl выдает ошибку (правильно).
Команда: «автомобиль», Tcl выдает ошибку (правильно, возможно, из-за 2 похожихкоманды).
Есть ли какой-то механизм, который Tcl делает, когда он не может найти команду?Дело в том, что я не могу найти ничего, что связано с нашим кодом, которое бы выполняло команды, поэтому, возможно, Tcl делает?