我正在写一个由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"
为什么会这样?
::tcl::mathfunc::min
仅支持8.6之前的Tcl版本中的两个参数吗?对我来说可靠的所有来源都说它总是有可变数量的参数,例如this,this或that。由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
的结果中。
答案 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'重新定义为正常的。