使用 Tcl C API 导航到列表中的元素

问题描述 投票:0回答:1

使用 lindex 命令访问 Tcl 列表中的子元素相当容易。这是我的清单:

set myList {Y {FUNCTION {{KEY1 KEY2 KEY3}}}}

我的目标是能够检索这个子列表:

键1键2键3。

Side Tcl,使用

lindex
命令我可以做到这一点:
lindex $myList {1 1 0}

对于Tcl C API,我想我需要使用这个函数Tcl_ListObjIndex,但它不允许你添加多个索引来从子列表中选择元素。 这是我的 C 代码:

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
代码,我不知道这是否非常有效或正确。

c tcl
1个回答
0
投票

虽然有一个内部 API 可以执行您正在谈论的确切操作(

TclLindexFlat()
),但它没有公开,因为它有点笨重(在引用计数管理和非别名方面有一些半繁重的侧面要求)列表和索引之间 - 这是作为命令处理的包装)。像这样多次调用
Tcl_ListObjIndex()
非常高效;开销很小。尴尬而不是大胜利?没有暴露!

如果您想要与

lset
等价的东西,那就更重要了,因为 不能 如此容易地由基本操作组成,同时保持高效。 (
TclListObjSetElement()
没有记录,并且多索引版本 -
TclLsetFlat()
- 根本没有暴露......)

如果您希望公开此类内容,您确实应该正确联系 Tcl 核心团队来解释您的用例,以说服我们清理这些内容以使用公共 API。

© www.soinside.com 2019 - 2024. All rights reserved.