使用tcl API进行字符串替换

时间:2009-10-21 16:44:39

标签: c tcl

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

我要做的是创建一个命令(在C中,但我会考虑做一个tcl-wrapper,如果有一种优雅的方法在那里做),它将一个块作为参数(即卷曲 - 括号引号字符串)。我想把这个块,拆分并执行替换,就像它要执行一样,但是停在那里并解释生成的行。

我考虑过创建一个名称空间,其中所有有效的第一个单词都被定义为命令,但是这个列表非常庞大(并且非常动态),所以它很快变得太麻烦了。我也试过这种方法,但使用unknown命令来拦截不同的命令。但是,unknown用于一堆东西,并且不能绑定到命名空间,所以每当我执行块时我都必须定义它,并将它设置回我以前的任何东西。做完了,感觉很不稳定。最重要的是,我冒着与实际命令发生冲突的风险(风险相当低,但不是零),所以我更倾向于不使用unknown命令。

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

看看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}