语法 TCL:__@_ 处缺少运算符

aeo*_*lus 2 syntax tk-toolkit tcl

我试图获取列表的最大值,该列表可能包含零,0。在 Tcl 8.5 中,当我运行时:

set x {-5 -4 -3 -2 -1 0 1 2 3 4 5}
set maxx [expr max($x)]
set minx [expr min($x)]
puts "$minx $maxx"
Run Code Online (Sandbox Code Playgroud)

我收到错误:

missing operator at _@_
in expression "max(-5 -4 -3 -2 -1 _@_0 1 2 3 4 5)"
(parsing expression "max(-5 -4 -3 -2 -1 0 1...")
invoked from within
"expr "max($x)""
invoked from within
"set maxx [expr "max($x"]"
Run Code Online (Sandbox Code Playgroud)

我尝试过我能找到的语法变化和资源。

作为解决方法,我将只使用 lsort 并获取该列表的第一个/最后一个元素,但我真的想知道我在这里做错了什么:/谢谢。

Joh*_*uhn 5

Tcl 表达式的工作方式有点不同,您不能直接将列表填充到其中并期望它起作用。

我建议你::tcl::mathfunc::max直接使用,带参数扩展({*}):

set maxx [::tcl::mathfunc::max {*}$x]
set minx [::tcl::mathfunc::min {*}$x]
Run Code Online (Sandbox Code Playgroud)

但如果您仍然想使用expr,您可以尝试使用 join 创建一个有效的表达式:

set maxx [expr "max([join $x ,])"]
set minx [expr "min([join $x ,])"]
Run Code Online (Sandbox Code Playgroud)

但这的性能很差并且可以被利用(代码注入),请考虑以下输入x{-1 {[puts "Not good"; exit]} 2}

  • `::` 是命名空间分隔符,`expr` 知道的所有函数都是命名空间 `tcl::mathfunc` 中的 Tcl 命令。`{*}` 用于参数扩展;基本上将 `someproc {*}{abc}` 转换为 `someproc abc`,将后面的参数(不带空格)扩展为超过 1 个参数。 (3认同)