extend tcl operator : 是否有直接的操作符扩展接口

extend tcl operator : is there a direct operator extension interface

如果我想介绍一些新的表达式运算符,例如"%%" 处理一些自定义数据结构,我需要重新定义 "expr" 命令才能识别它。这样对吗?

TCL扩展基本都是命令级别的,没有直接添加新operator的接口

你能证实我的理解吗?

mathop manual page calls out explicitly that while you can access the expr operators using the ::tcl::mathop namespace you cannot add new ones nor redefine the existing ones there. You can add you expr functions using the tcl::mathfunc namespace as documented in the expr 手册页,所以如果一个函数可以执行此操作,那么这是执行所需操作的最简单方法。

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

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

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

Tcl中的运算符直接在Tcl的字节码引擎中实现;您不能扩展它们或修改它们的语义。必须编辑表达式解析器(用 C 编写)或字节码引擎本身(编译器和执行引擎,均用 C 编写)。直接扩展 Tcl 的这一部分是相当困难的。 (您正在查看 tclParseExpr.ctclCompExpr.ctclExecute.c 至少 以使事情正常进行,并且很可能是其他 tclParse*tclComp* 文件,以及汇编程序和反汇编程序。不要掉以轻心!)

但是……

可以编写自己的命令,将字符串解释为您想要的任何内容,包括涉及您想要的任何新运算符的表达式。这就是 VecTcl 所做的。在幕后,它将其表达式语言转换为对实现各种运算符的 Tcl 命令的调用(其中一些是用 C 实现的,但作为一个普通的扩展包,所以这没什么不寻常的)。

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

vexpr {3*x}

有点像这样:

numarray::* 3 [set x]

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