Встроенный Tcl: Есть ли в Tcl команды автозаполнения? - PullRequest
0 голосов
/ 14 ноября 2018

У нас есть 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 делает?

1 Ответ

0 голосов
/ 14 ноября 2018

Как намекал Гленн, Tcl в интерактивном режиме (REPL) позволяет отправлять команды с использованием некоторого минимального, но однозначного префикса имени.Я не могу сказать, как ваш встроенный Tcl настроен, инициализирован и в конечном итоге работает как в интерактивном режиме.Однако вы можете попытаться «отключить» (переключить) интерактивный режим одним из следующих способов:

unset ::tcl_interactive

или

set ::tcl_interactive 0

Все это реализовано по умолчанию unknown обработчик.Следите за тем, как выглядит список cmds и как он обрабатывается по-разному, если tcl_interactive имеет значение true или false:

puts [info body unknown]
...