我正在为程序使用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 ]
...
答案 0 :(得分:1)
但是我对这个例子有疑问。当我在 shell(通过使用load example.o加载它)自动输入每个输入 调用API的解释器并运行相关的命令 到输入字符串。
假设您的脚本片段准确地表示了您的实际实现,那么问题是,一旦您的扩展名为{{,您的名为proc
的Tcl doSomething
就会被C实现的Tcl命令所取代1}}。过程和命令位于相同的名称空间中。当加载顺序相反时,问题将保持不变。
我读到所有内容都由tcl插入器评估,因此 在这种情况下,我应该将C包装函数的tcl名称命名为 特殊方式,例如cFunc。但是我对此不确定。
这是正确的。您必须以某种方式来组织C实现的命令及其脚本化的包装程序,以使它们的名称彼此不冲突。一些(基本)选项:
load
提示)cFunc
,从脚本化的改进扩展到C实现)。当前设置中的一个热修复解决方案(最好用某些实际设计代替)将是next
或rename
冲突的命令:
interp hide
load somefile.o
例如:
interp hide {} doSomething