首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tcl接口如何从Tcl获取列表

Tcl接口如何从Tcl获取列表
EN

Stack Overflow用户
提问于 2012-05-31 18:57:55
回答 3查看 2.5K关注 0票数 6

Tcl 8.4

在我的Tcl脚本中:

代码语言:javascript
复制
set foo1 false
set foo2 "yes"
set foo3 [list item1 item2 item3]

有一个应用程序接口可以获得像foo1或foo2这样的标量。例如:Tcl_GetVar(tcl_interp, string("foo1").c_str(), flags)。我想知道是否有任何API可以从Tcl获取列表(如foo3)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-31 20:12:45

这是一个分两个阶段的事情。您首先使用Tcl_GetVar系列函数之一获取值,然后获取您感兴趣的列表片段(通常使用Tcl_SplitListTcl_ListObjGetElements )。

举个更具体的例子:

代码语言:javascript
复制
////// FETCH FROM VARIABLE //////
// The NULL is conventional when you're dealing with scalar variable,
// and the 0 could be TCL_GLOBAL_ONLY or 
Tcl_Obj *theList = Tcl_GetVar2Ex(interp, string("foo1").c_str(), NULL, TCL_LEAVE_ERR_MSG);
if (theList == NULL) {
    // Was an error; message in interpreter result...
}

////// EXTRACT ELEMENTS //////
int objc;
Tcl_Obj **objv;
if (Tcl_ListObjGetElements(interp, theList, &objc, &objv) == TCL_ERROR) {
    // Not a list! error message in interpreter result...
}

////// WORK WITH VALUES //////
for (int i=0 ; i<objc ; i++) {
    const char *value = Tcl_GetString(objv[i]);
    // Whatever...
}
票数 7
EN

Stack Overflow用户

发布于 2012-05-31 20:08:25

我不确定,但Tcl_ListObjGetElements看起来像你想要的。或者,Tcl_ObjGetVar2将返回一个Tcl_Obj,然后您可以使用Tcl的其余部分处理列表对象。

票数 1
EN

Stack Overflow用户

发布于 2017-10-24 16:39:10

嗨,我发现了这个有用的链接,其中包含一个处理列表的示例:

参考::https://www.tcl.tk/man/tclx8.2/TclCommandWriting.3.html

代码语言:javascript
复制
int Tcl_LreverseObjCmd(notUsed, interp, objc, objv)
    ClientData    notUsed;              /* Not used. */
    Tcl_Interp   *interp;               /* Current interpreter. */
    int           objc;                 /* Number of arguments. */
    Tcl_Obj     **obj;                  /* Argument strings. */
{
    int listObjc, lowListIndex, hiListIndex;
    Tcl_Obj **listObjv;
    char *temp, *resultList;
    Tcl_Obj **newListObjv;

    /* Verify argument count.  Since we take only one argument, argument
     * count must be 2 (command plus one argument).
     */
    if (objc != 2)
        return TclX_WrongArgs (interp, objv [0], "list");

    /* Create an object to handle the new list we're creating */
    newListObjv = Tcl_NewObj();

    /* Crack the list at objv[1] into its own count and array of object
     * pointers.
     */
    if (Tcl_ListObjGetElements (interp, objv[1], &listObjc, &listObjv) != TCL_OK) {
        return TCL_ERROR;
    }

    /* For each element in the source list from last to first, append an
     * element to the new list.
     */
    for (listIndex = listObjc - 1; listIndex >= 0; listIndex--) {
        Tcl_ListObjAppendElement (interp, newListObjv, listObjv[listIndex]);
    }
FIX: NEED TO RETURN THE LIST.
    return TCL_OK;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10832265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档