Cadence Conference 14.2中::tcl::mathfunc::min的参数数目错误

Cadence Conference 14.2中::tcl::mathfunc::min的参数数目错误,tcl,cadence,Tcl,Cadence,我正在编写一个由Cadence Conference版本14.25或14.20执行的Tcl脚本,具体取决于启动时是查看日志文件还是启动屏幕 嵌入式Tcl解释器的版本似乎是 % package require Tcl 8.5.9 我的脚本使用::tcl::mathfunc::min函数,据我所知,该函数具有可变数量的参数,因此,例如,在我安装的版本为8.6.4的Tcsh中,应该可以执行以下操作: % ::tcl::mathfunc::min 1 2 3 1 但是,当通过“遭遇”执行时,情况似乎

我正在编写一个由Cadence Conference版本14.25或14.20执行的Tcl脚本,具体取决于启动时是查看日志文件还是启动屏幕

嵌入式Tcl解释器的版本似乎是

% package require Tcl
8.5.9
我的脚本使用::tcl::mathfunc::min函数,据我所知,该函数具有可变数量的参数,因此,例如,在我安装的版本为8.6.4的Tcsh中,应该可以执行以下操作:

% ::tcl::mathfunc::min 1 2 3
1
但是,当通过“遭遇”执行时,情况似乎并非如此,它仅适用于两个参数:

% ::tcl::mathfunc::min 1 
too few arguments for math function "min"
% ::tcl::mathfunc::min 1 2
1
% ::tcl::mathfunc::min 1 2 3
too many arguments for math function "min"
为什么会这样

Convence报告的Tcl版本是否存在谎言? 遭遇战的Tcl解释器坏了吗? 在8.6之前的tcl版本中::tcl::mathfunc::min是否仅支持两个参数?在我看来,所有可靠的来源都声明它总是有可变数量的参数,例如,或。 由以下原因引发的进一步调查:

遭遇:

% info args ::tcl::mathfunc::min
"::tcl::mathfunc::min" isn't a procedure
太好了

我发现全局范围中有一个min命令具有相同的行为,但错误消息不同:

% min 1
wrong # args: should be "min x y"
% min 1 2
1
% min 1 2 3
wrong # args: should be "min x y"

两个::min、::tcl::mathfunc::min都不包含在interp别名的结果中。

如果使用命令

info args ::tcl::mathfunc::min
info body ::tcl::mathfunc::min
在嵌入式和普通Tcl解释器中,您应该能够在两个位置看到构成min函数的参数和代码。如果您的调查显示它们可能不同,那么您可以使用不同的名称创建自己的min函数,my_min说,或者替换::tcl::mathfunc::命名空间中现有的min函数。注意:在Tcl 8.5及更高版本中,您在::Tcl::mathfunc命名空间中创建的函数可以在expr函数中使用

Convence报告的Tcl版本是否存在谎言

不一定。与Tcl定义的任何命令一样,可以重新定义:::Tcl::mathfunc::min。这不是一个好主意,但这样做是合法的

遭遇战的Tcl解释器坏了吗

以次要的方式。我不知道他们为什么这么做

在8.6之前的tcl版本中::tcl::mathfunc::min是否仅支持两个参数

看起来它在8.5版本中也可以使用很多参数。它在8.4中不存在;min函数与命令分派机制的常规函数同时引入。

引入::tcl::mathfunc的技巧有一些有趣的特性,您可以使用原始::tcl::mathfunc::min代替Cadence提供的两个参数版本

它说:

名称空间将能够定义它们自己的数学函数 在这些名称空间之外可见。如果命名空间定义了一个函数 [命名空间当前]::tcl::mathfunc::f,然后在表达式中调用f 在该命名空间中求值将优先解析为 ::tcl::mathfunc::f。这条规则不仅允许两个扩展都可以 定义函数f而不发生冲突,但它也允许扩展 重写内置函数,如sin。 见:


因此,在您自己的代码中,您可以通过在自己的命名空间中提供适当的实现,简单地将“min”重新定义为正常值。

::tcl::mathfunc::min和::tcl::mathfunc::max是在tcl中实现的。感谢您的提示,我已经用我的发现更新了这个问题。我已经编写了自己的替换程序,然后才发现我可以从info body复制代码。@mkrieger1从您看到的情况来看,我怀疑cadence开发人员已经用自己的版本替换了标准的min函数,可能是在应用程序创建其Tcl解释器时从.so或.dll加载的扩展库中。
$ tclsh8.5
% expr min(1,2,3,4,5)
1