На уровне C интерпретатор Tcl представлен дескриптором типа Tcl_Interp *
(который следует обрабатывать так, как если бы он указывал на непрозрачную структуру). Это обычно называют именем interp
людьми, работающими с Tcl API, но это не очень важно. После того, как у вас есть такая ручка, можно использовать:
int returnCode = Tcl_Eval(interp, "puts \"Hello World\"");
запустить код (обратные косые черты там, потому что мы помещаем в двойные кавычки внутри строки С постоянной). Код возврата будет равен TCL_OK
, если выполнение завершено успешно и будет равно TCL_ERROR
, если что-то пошло не так. В случае OK вы получаете значение результата с Tcl_GetObjResult(interp)
(и вы можете использовать Tcl_GetString
, чтобы получить строчную версию результата для печати). В случае ошибки вы используете те же функции (то есть Tcl_GetObjResult
, Tcl_GetString
), чтобы получить сообщение об ошибке. Возможны другие коды возврата, но вы их обычно не увидите.
Конечно, результат puts
- пустая строка успеха; сообщение распечатывается, а не возвращается.
Как вы можете получить эту интерпретатор-интерпретатор? Ну, это действительно зависит от того, как ваш код интегрируется с Tcl. Если вы пишете общую библиотеку, которая Tcl будет load
, это единственный аргумент вашей функции инициализации. С другой стороны, если вы встраиваете Tcl, то вы, вероятно, в какой-то момент вызываете Tcl_CreateInterp()
, который возвращает дескриптор новому создаваемому интерпретатору. Обычно это довольно очевидно, что вы делаете.
Если процессы TCL и C можно рассматривать и решать как независимые процессы, что любой стандартный механизм IPC может быть использован для передачи информации между ними. Содержимое из процесса «C» представляет собой текст, который может быть «оценен» из процесса TCL после получения, чтобы выполнить команду tcl. – Sharad
Не могли бы вы уточнить? Все, что вы упомянули, желательно, но, как это сделать, это вопрос. –