-1

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

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

% package require Tcl
8.5.9

我的脚本使用该::tcl::mathfunc::min函数,据我了解,该函数具有可变数量的参数,因此例如以下应该可以工作(它在我的安装中tclsh具有版本 8.6.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

杰克逊的回答引发了进一步的调查:

相遇中:

% 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

4

3 回答 3

1

介绍的 TIP::tcl::mathfunc有一些有趣的功能,您可以使用它来使用原始::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”重新定义为普通代码。

于 2015-08-12T12:31:55.800 回答
1

Encounter报的Tcl版本是不是说谎?

不必要。与 Tcl 定义的任何命令一样,::tcl::mathfunc::min可以重新定义。这样做不是一个好主意,但这样做是合法的……</p>

Encounter的Tcl解释器坏了吗?

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

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

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

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

于 2015-08-07T14:57:02.133 回答
1

如果你使用命令

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

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

于 2015-08-07T08:19:54.833 回答