【问题标题】:Tcl callback from C/C++ with SWIG使用 SWIG 从 C/C++ 回调 Tcl
【发布时间】:2013-06-12 20:28:16
【问题描述】:

上下文 我想通过 SWIG 从 C/C++ 调用 Tcl 回调。更重要的是,我希望它是一个闭包。

先验知识 http://computer-programming-forum.com/57-tcl/4481cebe0f09966d.htm(不,那不是我,只是在 Google 搜索中看起来足够相似的唯一东西)

使用 Python,我在 Python 端创建一个对象,给它一个 __call__ 方法,通过 SWIG 将它作为 PyObject* 丢弃,它仍然可以访问 Python 中编码的非局部变量(有点胶水代码),因为它仍然与创建它的解释器密切相关。

我的理解(在这里纠正我) 在 Tcl 中,我从 C 调用函数的唯一方法是通过一个新的解释器传递一个表示命令的字符串(但是......那么闭包在哪里......?)。如果我从 Tcl 调用 C/C++,仍然有同样的问题,因为 C/C++ 不知道调用 Tcl 解释器。

Annnnddd...文档 (http://www.tcl.tk/man/tcl8.6/TclLib/contents.htm) 虽然内容丰富,但...嗯,确实很丰富。集体知识请拯救我的无知。

问题如何获得闭包/修改 Tcl 中的名称从 C/C++ 指向的值?或者甚至只是获取调用 C/C++ 代码的解释器的句柄...?

【问题讨论】:

  • 我正在尝试了解您正在尝试的呼叫模式。您是否要创建一个 Tcl 命令,该命令在调用时会在 C++ 端调用某种闭包?
  • 而且 Tcl 不做闭包(由于 Tcl 中值的性质,这很难修复;该语言实际上大量使用不可变引用)。它确实在 8.6 中执行协程和类,但它们是 named 实体;真正的价值观不能那样运作。
  • 第一条评论:是的。第二条评论,好吧,编辑/编辑问题。

标签: c tcl swig


【解决方案1】:

在这一切中要明白,Tcl 的实现在很大程度上是一个 C 库,C 的做事方式也是如此,而不是 C++ 的。这可能会让

您想要将 C++ 闭包作为一个字段放入您使用 new 分配的 struct 中。然后,您将 指针 转换为 struct 作为 ClientData 参数到 Tcl_CreateCommand;当命令被调用时,你会将该指针作为回调函数的参数之一取回,然后你可以将其转换回它的真实类型,然后调用。当命令被删除时,你会得到另一个回调(如果你要求它),那是delete分配的struct伟大时间。听起来工作量很大,但实际上并非如此。

我不知道如何将它与一个好的 SWIGgable 方法联系起来,因为我没有在自己的生产代码中使用 SWIG 或 C++。也许把闭包放在一个普通的对象中,然后 SWIG 呢?然而,在幕后,需要发生的是上述情况。 (不幸的是,所涉及的转换类型是 reinterpret_cast<…>ClientData 实际上只是 void * 的别名——除非你使用的是带有古老编译器的古老版本的 Tcl——以及 Tcl 库代码的承诺不会以任何方式戳进去。)我建议使用struct,因为你必须把东西挂起来的整个空间只是一个机器指针的宽度。更重要的是,您可能可以将所有内容封装在一个不错的类中以隐藏血淋淋的细节,但由于我不是 C++ 大师,因此我无法真正帮助您。

【讨论】:

  • 从 C 语言很容易。将指针放在ClientData 中就完成了。
  • 好吧,所以...我正在创建一个命令来从 Tcl 中检索一个命令。我在使用我的扩展注册回调的解释器中创建了这个命令(但是如果我是扩展/Tclsh 是“主机”,如何让解释器调用我?)。该命令被调用,并将一些回调的名称传回给我(如果我在主机解释器上有句柄,它可能会改变名称)。所有这一切似乎都以我掌握主机解释器为条件,Tcl 文档并没有特别说明这一点。做什么?
  • @Atash 如果您的代码位于共享库中,并且您希望将其合并到 Tcl 解释器中,请从 the Wiki page for load 开始,并确保查看“讨论”部分。在另一个方向上,您正在嵌入 Tcl 并应用一组不同的准则(例如,您必须关心库初始化)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多