扩展tcl操作员:是否有直接操作员扩展界面

扩展tcl操作员:是否有直接操作员扩展界面,tcl,Tcl,如果我想引入一些新的表达式运算符,例如“%%”来处理一些自定义数据结构,我需要重新定义“expr”命令来识别它。是这样吗 TCL扩展基本上处于命令级别,没有直接添加新操作员的界面 您能确认我的理解吗?手册页面明确指出,虽然您可以使用::tcl::mathop名称空间访问expr运算符,但您不能在其中添加新运算符,也不能重新定义现有运算符。您可以使用手册页中记录的tcl::mathfunc名称空间添加expr函数,因此如果函数将执行此操作,这是执行所需操作的最简单方法 否则,您可以拦截expr命令

如果我想引入一些新的表达式运算符,例如“%%”来处理一些自定义数据结构,我需要重新定义“expr”命令来识别它。是这样吗

TCL扩展基本上处于命令级别,没有直接添加新操作员的界面

您能确认我的理解吗?

手册页面明确指出,虽然您可以使用
::tcl::mathop
名称空间访问expr运算符,但您不能在其中添加新运算符,也不能重新定义现有运算符。您可以使用手册页中记录的
tcl::mathfunc
名称空间添加expr函数,因此如果函数将执行此操作,这是执行所需操作的最简单方法

否则,您可以拦截expr命令本身。如果重命名expr命令并定义自己的替换,则可以执行一些表达式解析,并使用函数调用替换自定义运算符,或者将表达式传递给实际实现。下面是一个简单的例子

rename expr _expr
proc expr {args} {puts "called expr $args"; _expr {*}$args}

总之,你的理解是正确的。您不能将新运算符注入表达式解析器。

Tcl中的运算符直接在Tcl的字节码引擎中实现;您不能扩展它们或修改它们的语义。如果不编辑表达式解析器(用C编写)或字节码引擎本身(编译器和执行引擎,两者都用C编写),就不能这样做。直接扩展Tcl的这一部分相当困难。(您正在查看
tclparsexpr.c
tclccompexpr.c
tclExecute.c
,至少是为了让事情顺利进行,很可能还有其他
tclParse*
tclComp*
文件,以及汇编程序和可能的反汇编程序。不要掉以轻心!)

然而… 您可以编写自己的命令,将字符串解释为您想要的任何内容,包括包含您想要的任何新运算符的表达式。这就是我们要做的。在封面下,它将其表达式语言转换为对实现各种操作符的Tcl命令的调用(其中一些是用C实现的,但作为一个普通的扩展包,所以这并不奇怪)

实际上,它转换其表达式之一的调用:

vexpr {3*x}
有点像这样:

numarray::* 3 [set x]

然后,它可以使用Tcl的字节码引擎执行(坦白地说,这是一个微不足道的执行,但在更复杂的示例中更有意义;请参阅,这在这里有点太长,无法重现)。

mathop命令的特殊之处在于,它们生成高效的字节码。更改它们不会影响表达式引擎本身;Tcl内部的功能融合更深。