使用 lindex 命令访问 Tcl 列表中的子元素相当容易。这是我的清单:
set myList {Y {FUNCTION {{KEY1 KEY2 KEY3}}}}
我的目标是能够检索这个子列表:
键1键2键3。
Side Tcl,使用
lindex
命令我可以做到这一点:lindex $myList {1 1 0}
。Tcl_Obj* first_list = Tcl_NewObj();
Tcl_Obj* sub_list = Tcl_NewObj();
Tcl_Obj* subsub_list = Tcl_NewObj();
Tcl_ListObjIndex(interp, myList, 1, &first_list);
Tcl_ListObjIndex(interp, first_list, 1, &sub_list);
Tcl_ListObjIndex(interp, sub_list, 0, &subsub_list);
return subsub_list;
它有效,但我刚刚尝试将我的
Tcl
代码翻译为 C
代码,我不知道这是否非常有效或正确。
虽然有一个内部 API 可以执行您正在谈论的确切操作(
TclLindexFlat()
),但它没有公开,因为它有点笨重(在引用计数管理和非别名方面有一些半繁重的侧面要求)列表和索引之间 - 这是作为命令处理的包装)。像这样多次调用 Tcl_ListObjIndex()
非常高效;开销很小。尴尬而不是大胜利?没有暴露!
如果您想要与
lset
等价的东西,那就更重要了,因为 不能 如此容易地由基本操作组成,同时保持高效。 (TclListObjSetElement()
没有记录,并且多索引版本 - TclLsetFlat()
- 根本没有暴露......)
如果您希望公开此类内容,您确实应该正确联系 Tcl 核心团队来解释您的用例,以说服我们清理这些内容以使用公共 API。