Eu enfrentei o problema - eu tenho o código C da biblioteca de otimização, e ele aceita ponteiro para função como um dos argumentos. Então, anteriormente eu usei SWIG para gerar o wrapper Tcl para funções C, mas neste caso eu preciso chamar a função Tcl de C. Cada vez que o retorno de chamada é invocado, ele calcula os valores das funções com parâmetros particulares como seus argumentos. Eu quero chamar o procedimento Tcl para isso, e isso deve ser feito dentro do mesmo interpretador que eu chamo o procedimento de otimização C, e então retorno os dados de volta para o programa C.
Descobri que não é possível com SWIG sem modificar o código-fonte C e alguns hacks de typemaps. Quais são as outras opções? Verifiquei Critcl, mas lá novamente tenho que modificar e reordenar o código-fonte C. A única opção viável que vejo agora é o uso direto da API Tcl C. Há alguma outra maneira de fazer isso? Obrigado.
A melhor maneira de chamar um comando Tcl de C é a função API
Tcl_EvalObjv()
. Você precisa de um contexto de interpretador para chamar isso, e o nome do comando e outros argumentos para o comando são passados em uma matriz deTcl_Obj*
handles (o tipo de caixa que contém todos os valores Tcl). Esse método de chamada tem os menores overheads, mas os valores passados devem ter uma contagem de referência diferente de zero (ou seja, chamáTcl_IncrRefCount
-los antes eTcl_DecrRefCount
depois).Caso contrário, crie uma string e chame
Tcl_Eval()
(ou um valor Tcl e chameTcl_EvalObj()
). Isso incorre em overheads adicionais, como a necessidade de analisar a string.Você pode fabricar
Tcl_Obj*
alças usando chamadas comoTcl_NewIntObj()
ouTcl_ObjPrintf()
.Consulte https://www.tcl-lang.org/man/tcl8.6/TclLib/Eval.htm para obter mais opções para chamar comandos de C.