【发布时间】:2019-05-30 20:13:17
【问题描述】:
我们使用第三方 Tcl 解析库来验证 Tcl 脚本的语法和语义检查。该驱动程序是用 C 语言编写的,并定义了一组实用函数。然后它调用Tcl_CreateObjCommand 以便脚本可以调用这些C 函数。现在我们正在移植主程序,但我找不到这样做的方法。有人知道从 Tcl 脚本调用 golang 函数的方法吗?
static int
create_utility_tcl_cmds(Tcl_Interp* interp)
{
if (Tcl_CreateObjCommand(interp, "ip_v4_address",
ip_address, (ClientData)AF_INET, NULL) == NULL) {
TCL_CHECKER_TCL_CMD_EVENT(0, "ip_v4_address");
return -1;
}
.....
return 0;
}
【问题讨论】:
-
您可以使用 cgo 从 C 代码中调用 Go 函数,Google 搜索
go tcl得到的第一个结果是:github.com/nsf/gothic -
新的主程序将进入,因此选项 1 退出。至于第二个,我会更深入地研究,但我认为它可以与我们的第三方 tcl 库一起使用,因为它已经很老了
-
cgo 无论如何都将成为与非 Go 代码交互的解决方案(即使我链接的库也是一个 cgo 包装器)。如有必要,您可以为您的特定库编写自己的绑定。
-
Tcl_CreateCommand注册的回调函数(一开始可能更容易处理)接受一个 C 字符串数组,这些字符串是函数的参数字。客户端数据只是一个任意指针 (void*),Tcl 没有解释就传回它,如果不需要它可以为 NULL;在 C++ 绑定中,它用于保存对象的 thunk,该命令是该对象的方法调度程序。