【问题标题】:String substitution using tcl API使用 tcl API 进行字符串替换
【发布时间】:2009-10-21 16:44:39
【问题描述】:

有没有办法(ab)使用 tcl C-API 来“解析”一个字符串,执行所有替换(包括方括号中的子命令),但在实际评估生成的命令行之前停止?

我要做的是创建一个命令(在 C 中,但我会考虑做一个 tcl-wrapper,如果那里有一种优雅的方法),它将一个块作为参数(即 curly-大括号引用字符串)。我想取出那个块,将它拆分并以与执行它相同的方式执行替换,但停在那里并改为解释结果行。

我考虑过创建一个命名空间,其中所有有效的第一个单词都被定义为命令,但是这个列表非常庞大(而且几乎是动态的),因此很快就会变得过于繁琐。我也尝试过这种方法,但使用unknown 命令拦截不同的命令。但是,unknown 用于一堆东西,不能绑定到命名空间,所以我必须在执行块时定义它,并在完成后将其设置回之前的状态,感觉很不稳定。最重要的是,我会冒与实际命令发生冲突的风险(相当低的风险,但不是零),所以我非常不想使用unknown 命令。

我能得到的最接近的是Tcl_ParseCommand(以及该家族的其他成员),它会生成一个解析树,我可以手动评估它。如果没有更好的解决方案,我想我会采用这种方式,但如果有“官方”方式,我当然更喜欢它..

我错过了什么吗?

【问题讨论】:

    标签: c tcl


    【解决方案1】:

    看看Tcl_SubstObj。它是 [subst] 命令的 C 等效项,这似乎就是您要查找的内容。

    正如您在评论中指出的那样, subst 并不能完全满足您的要求。如果有帮助,您可能正在寻找以下 Tcl 代码:

    > set mydata {mylist item $listitem group item {$group item}}
    > set listitem {1 2 3}
    > subst $mydata      ;# error: can't read "group": no such variable
    > proc groupsubst {data} {
        return [uplevel 1 list $data]
    }
    > groupsubst $mydata ;# mylist item {1 2 3} group item {$group item}
    

    【讨论】:

    • 好建议,唯一的问题是它会忽略花括号,我会看看我是否可以使用它......
    • 这是对 uplevel 的一种创造性使用.. :) 相当于 eval [concat list $mydata],不过是个好主意,谢谢!
    • proc里面的代码是等价的。 proc 本身专门使用 uplevel 来确保代码/变量替换发生在调用它的堆栈级别。您无法在我的 proc 中使用 [eval [concat ...]] 并获得相同的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2019-08-24
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多