Книжку по Tcl, про которою я говорил ранее, я дочитал. В ней есть глава, посвяшённая теме моего поста. Использование Tcl оказывается весьма и весьма простым.
Есть три задачи, которые необходимо решать при работе с любым скриптовым языком:
Есть три задачи, которые необходимо решать при работе с любым скриптовым языком:
- Вызов из основной программы скриптовых функций.
- Вызов из под скрипта функций основной программы.
- Передача данных между скриптом и основной программой.
В принципе третий пункт вполне можно реализовать через первые два.
В следующем примере создаётся инстанс интерпретатора, создаётся Tcl функция equal, которая реализуется на C и вызывается в интерпретаторе.
#include "tcl.h"
//Хэндл интерпретатора
Tcl_Interp* interp = NULL;
//функция, которая будет вызвана интерпретатором
int EqualCmd(ClientData clientData,
Tcl_Interp* interp, int argc, char** argv)
{
//устанавливаем возвращаемое значение
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(strcmp(argv[1], argv[2]) ? 0 : 1 ) );
return TCL_OK;
}
int main(int argc,char** argv)
{
//создаётся инстанс интерпретатора
interp = Tcl_CreateInterp();
int bResult;
//создаётся Tcl функция equal, которая обрабатывается в ф-ции EqualCmd
Tcl_CreateCommand(interp, "equal", (Tcl_CmdProc*)EqualCmd,
(ClientData*)NULL, (Tcl_CmdDeleteProc*)NULL);
//вызываем функцию equal для значений 10 и 10
if(TCL_OK == Tcl_Eval(interp, "equal 10 10"))
{
Tcl_Obj* pResult = Tcl_GetObjResult(interp);
Tcl_GetBooleanFromObj(interp, pResult, &bResult);
printf("result = %i\n", bResult);
}
//вызываем функцию equal для значений 20 и 10
if(TCL_OK == Tcl_Eval(interp, "equal 20 10"))
{
Tcl_Obj* pResult = Tcl_GetObjResult(interp);
Tcl_GetBooleanFromObj(interp, pResult, &bResult);
printf("result = %i\n", bResult);
}
//удалякм инстанс интерпретатора
Tcl_DeleteInterp(interp);
return 0;
}
Для обмена данными между интерпретатором и программой используются функции Tcl_SetVar и Tcl_GetVar, которые позволяют устанавливать и получать значение переменных. Кроме этих вполне ожидаемых средств в Tcl есть и другая интересная фишка - возможность линковать между собой переменную в C коде и переменную в Tcl скрипте. Когда меняется одна, меняется и другая.
Комментариев нет:
Отправить комментарий