在Tcl中有缩写来获得一系列连续的数字吗?

时间:2011-08-03 12:26:04

标签: tcl

例如,在Perl中,要获得从1到10的连续数字数组,您可以这样做:

@myArray = (1 .. 10);

这两个句点用作此操作的简写,而不是进行for循环或手动编写整个事物。我用过的其他语言也有类似的东西。

Tcl中是否存在类似的简写?

4 个答案:

答案 0 :(得分:5)

不完全是这个,但是

% package require struct::list
1.6.1
% struct::list iota 10
0 1 2 3 4 5 6 7 8 9

还可以在this搜索“iota”关键字,了解如何使用单行代码完成此操作。

答案 1 :(得分:5)

您可以定义方法:

proc fillArray {a b} {
    eval return \[list $a [string repeat "\[incr a\] " [incr b -$a]]\]
}

并将其用作:

set myArray [fillArray 1 10]

你甚至可以美化程序的调用,使它看起来像在perl中。为此,只需重新定义unknown程序:

rename unknown __unknown
proc unknown {args} {
  if {[llength $args] == 3} {
    lassign $args a op b
    if {[string is integer $a] && $op == ".." && [string is integer $b]} {
      return [fillArray $a $b]
    }
  }
  return [uplevel __unknown {*}$args]
}

之后你可以写简单的:

set myArray [1 .. 10]

:)

答案 2 :(得分:5)

除了表达式(它们是他们自己的小语言)之外,Tcl没有运算符,并且始终是严格的前缀驱动语言。这意味着没有这种方便的简写来做循环。另一方面,Tcl的标准命令没有什么特别之处(除了一些无关紧要的效率细节),所以制作你自己的没有问题:

proc .. {from to} {
    if {$from >= $to} {
        for {set i $from} {$i <= $to} {incr i}    {lappend out $i}
    } else {
        for {set i $from} {$i >= $to} {incr i -1} {lappend out $i}
    }
    return $out
}

puts [.. 1 10];   # --> “1 2 3 4 5 6 7 8 9 10”

你可以使用一个未知的处理程序伪造中缀运算符(如在GrAnd的答案中),但与上面相比,这真的很慢。

答案 3 :(得分:1)

不,tcl中不存在类似的简写。

如果你真的想要速记,你可以创建自己看起来几乎相同的命令。例如:

proc : {start ignore end} {
    set result []
    for {set i $start} {$i <= $end} {incr i} {
        lappend result $i
    }
    return $result
}

puts "from 1 to 10: [: 1 .. 10]"