【问题标题】:invoking TCL C API's inside tcl package procedures在 tcl 包过程中调用 TCL C API
【发布时间】:2018-08-24 16:25:52
【问题描述】:

我正在为我的程序使用 TCL-C API。
我阅读并创建了与C++ example类似的测试程序。
但我对这个例子有疑问。当我在 shell 中使用这个示例时(通过使用 load example.o 加载它),每个输入都会自动调用 API 的解释器并运行与输入字符串相关的命令。
但是假设我希望输入将调用我需要的包内的 tcl 过程,该过程将检查参数并打印另一条消息,并且只有在此之后才会调用 TCL-C API 相关函数(一种包装器),在这种情况下,我该怎么办?
我在某处读到符号@ 是应该用于调用外部程序的符号,但我就是找不到它在哪里。
我将举一个小例子让事情更清楚。

somepackage.tcl

proc dosomething { arg1 , arg2 , arg3 } {
   # check args here #
   set temp [ #invoke here TCL-C API function and set it's result in temp ]
   return $temp
}

package provide ::somepackage 1.0  

test.tcl

package require ::somepackage 1.0
load somefile.o   # this is the object file which implements TCL-C API commands [doSomething 1 2 3 ]
...

【问题讨论】:

  • 请更具体。究竟是什么错误。向我们展示您正在尝试执行的代码。目前还不清楚你在这里问什么。而@ 不会在 Tcl 或 C 中调用任何东西。
  • 我正在尝试调用我通过 .o 文件从 tcl 中的过程加载的 C 包装函数。我读到一切都由 tcl interperter 评估,所以在这种情况下,我应该以特殊方式命名 C 包装函数的 tcl 名称,例如 cFunc。但我不确定。

标签: api tcl itcl


【解决方案1】:

但我对这个例子有疑问。当我在 shell(通过加载example.o加载它)每个输入自动 调用 API 的解释器并运行相关的命令 到输入字符串。

如果您的脚本 sn-ps 以准确的方式表示您的实际实现,那么问题是一旦您的扩展名是 loaded,您的 Tcl proc 命名为 doSomething 就会被 C 实现的 Tcl 命令替换.过程和命令位于相同的命名空间中。当加载顺序颠倒时,问题仍然存在。

我读到 tcl interperter 正在评估所有内容,所以在 在这种情况下,我应该将 C 包装函数的 tcl 名称命名为 特殊方式,例如 cFunc。但我不确定。

这是正确的。您必须以一种名称不会相互冲突的方式组织 C 实现的命令及其脚本包装器。一些(基本)选项:

  • 使用两个不同的 Tcl 命名空间,具有相同的命名过程
  • 对包装过程和命令应用一些命名约定(您的cFunc 提示)
  • 如果您的 API 是作为实际的 Itcl 或 TclOO 对象提供的,并且各个命令是方法,则可以使用子类或 mixin 来托管细化(使用超引用,例如 TclOO 中的 next,以从脚本改进到 C 实现)。

您当前设置中的热修复解决方案(最好用一些实际设计代替)是renameinterp hide 冲突命令:

  1. load somefile.o
  2. 隐藏现在可用的命令:interp hide {} doSomething
  3. 定义一个脚本化的包装器,在某个时候调用隐藏的原件:

例如:

proc doSomething {args} {
  # argument checking
  set temp [interp invokehidden {} doSomething {*}$args]
  # result checking
  return $temp
}

【讨论】:

  • 谢谢...这正是我要找的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多