dram.me

Tcl中的列表类型

Tcl的类型机制非常特殊,可以认为一切都是字符串,但实际上在内部实现时针对不同类型有不同的数据表示,“内部表示”和“字符串表示”保持惰性一致。

而列表也是做了同样的处理。Tcl有较多与列表相关的接口,但在与CLIPS的对接过程中,发现缺少这样的接口,将列表的所有元素导出为C的字符串数组。

当前是通过先将列表以字符串形式读取(Tcl_GetString),之后再拆分为数组元素(Tcl_SplitList)实现,其中存在性能问题,详见这个提交

另外一种思路是结合Tcl_ListObjGetElements实现,由于Tcl内部采用引用计数,Tcl端不存在性能损失,问题在CLIPS端,因为CLIPS没有批量转化multifield的接口(某种map$),所以需要频繁创建销毁multifield对象用于组建最终接口。

从Tcl在接口中对string一词的使用来看,可以考虑添加Tcl_ListObjGetElementStrings这样的接口。但为保证与Tcl接口的一致性,暂不考虑在CLIPS-Tcl中添加。