Cadence Encounter 14.2中{:: ccl :: mathfunc :: min的参数数量错误

时间:2015-08-06 18:12:43

标签: tcl cadence

我正在写一个由Cadence Encounter版本14.25(或14.20执行的Tcl脚本,取决于我是否在启动时查看日志文件或启动画面......)。

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

% package require Tcl
8.5.9

我的脚本使用::tcl::mathfunc::min函数,根据我的理解,该函数具有可变数量的参数,因此例如以下内容应该有效(它在我的tclsh的安装中有8.6版本0.4):

% ::tcl::mathfunc::min 1 2 3
1

然而,当被Encounter执行时,似乎并非如此,它只适用于两个参数:

% ::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"

为什么会这样?

  • Encounter报告的Tcl版本是否存在?
  • Encounter的Tcl解释器坏了吗?
  • ::tcl::mathfunc::min仅支持8.6之前的Tcl版本中的两个参数吗?对我来说可靠的所有来源都说它总是有可变数量的参数,例如thisthisthat

Jackson's answer触发的进一步调查:

在遭遇:

% 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 aliases的结果中。

3 个答案:

答案 0 :(得分:1)

如果您使用命令

info args ::tcl::mathfunc::min
info body ::tcl::mathfunc::min

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

答案 1 :(得分:1)

  

Encounter报告的Tcl版本是否存在?

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

  

遭遇遭遇的Tcl解释器?

以微小的方式。我不知道他们为什么会这样做。

  

::tcl::mathfunc::min仅支持8.6之前的Tcl版本中的两个参数吗?

$ tclsh8.5
% expr min(1,2,3,4,5)
1

看起来它也适用于8.5中的许多参数。 (它没有在8.4中存在; min函数与一般的函数到命令调度机制同时引入。)

答案 2 :(得分:1)

引入::tcl::mathfunc的TIP有一些有趣的功能,您可以使用它来使用原始::tcl::mathfunc::min而不是Cadence提供的两个arg版本。

它说:

    命名空间将能够定义自己的数学函数     在这些命名空间之外可见。如果命名空间定义了一个函数     [namespace current] :: tcl :: mathfunc :: f,然后在表达式中调用f     在该命名空间中评估将优先解析为它     :: TCL :: mathfunc :: F。此规则不仅允许两个扩展     定义没有碰撞的函数f,但它也允许扩展     覆盖内置函数,例如sin。“

请参阅:http://www.tcl.tk/cgi-bin/tct/tip/232.html

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