调用TCL C API的内部tcl包过程

时间:2018-08-24 16:25:52

标签: api tcl itcl

我正在为程序使用TCL-C API。
我阅读并创建了与此C++ example类似的测试程序。
但是我对这个例子有疑问。当我在外壳中使用此示例时(通过将其装入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 ]
...

1 个答案:

答案 0 :(得分:1)

  

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

假设您的脚本片段准确地表示了您的实际实现,那么问题是,一旦您的扩展名为{{,您的名为proc的Tcl doSomething就会被C实现的Tcl命令所取代1}}。过程和命令位于相同的名称空间中。当加载顺序相反时,问题将保持不变。

  

我读到所有内容都由tcl插入器评估,因此   在这种情况下,我应该将C包装函数的tcl名称命名为   特殊方式,例如cFunc。但是我对此不确定。

这是正确的。您必须以某种方式来组织C实现的命令及其脚本化的包装程序,以使它们的名称彼此不冲突。一些(基本)选项:

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

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

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

例如:

interp hide {} doSomething