使用Tcl的apply函数列表排序

时间:2018-01-04 09:20:54

标签: sorting tcl apply expr

假设我有一个如下列表:

set listNums {0 -1 5 5 -5 1 10 100 -10 -10 1000}

我想使用绝对值对其进行排序。我从另一个脚本中选择了下面的内容。我很难理解这一点。有人可以帮我理解下面脚本中发生的事情吗?我用了#34; puts"在每个阶段打印出值,但我仍然没有得到它!

" a"和" b"得到更新?为什么我们需要"返回0" ?
对不起,如果我问的是基本问题。

lsort -command {apply {
  {a b}
  {
    if {[expr {abs($a)] < [expr {abs($b)}]} {return -1}
    if {[expr {abs($a)] > [expr {abs($b)}]} {return 1}
    if {$a < $b} {return -1}
    if {$a > $b} {return 1}
    return 0
  }
}} $listNums

1 个答案:

答案 0 :(得分:2)

每次在排序过程中比较两个元素时,一个元素作为a传递给此调用,另一个元素作为b传递。

比较的结果可以是&#34;小于&#34;,&#34;大于&#34;或&#34;等于&#34;,编码为返回值-1,1,或者0。

另外,试试

if {abs($a) < abs($b)} ... 

代替:if隐式调用expr的条件。

并且不要两次比较。

文档: applyiflsort