вторник, 11 декабря 2007 г.

Интеграция Tcl в программу на C/C++

Книжку по Tcl, про которою я говорил ранее, я дочитал. В ней есть глава, посвяшённая теме моего поста. Использование Tcl оказывается весьма и весьма простым.
Есть три задачи, которые необходимо решать при работе с любым скриптовым языком:


  1. Вызов из основной программы скриптовых функций.

  2. Вызов из под скрипта функций основной программы.

  3. Передача данных между скриптом и основной программой.

В принципе третий пункт вполне можно реализовать через первые два.
В следующем примере создаётся инстанс интерпретатора, создаётся 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 скрипте. Когда меняется одна, меняется и другая.

Комментариев нет: