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

Nat*_*ate 2 tcl

例如,在Perl中,要获得从1到10的连续数字数组,您可以简单地执行以下操作:

@myArray = (1 .. 10);
Run Code Online (Sandbox Code Playgroud)

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

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

kos*_*tix 5

不是这个,但是

% package require struct::list
1.6.1
% struct::list iota 10
0 1 2 3 4 5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

同时在搜索"iota"关键字,看看如何使用单行完成此操作.

  • @Nate,Tcl的方法有其优点:你可以创建任意数量的这些方便的命令,它们看起来与"本机"工具没什么区别.而且我不会将(X ... Y)符号视为语言的语法,否则我们也可以考虑例如因子文字和诸如此类的东西;-) (2认同)

GrA*_*And 5

您可以定义方法:

proc fillArray {a b} {
    eval return \[list $a [string repeat "\[incr a\] " [incr b -$a]]\]
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

set myArray [fillArray 1 10]
Run Code Online (Sandbox Code Playgroud)

你甚至可以美化程序的调用,使它看起来像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]
}
Run Code Online (Sandbox Code Playgroud)

之后你可以写简单如下:

set myArray [1 .. 10]
Run Code Online (Sandbox Code Playgroud)

:)


Don*_*ows 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”
Run Code Online (Sandbox Code Playgroud)

您可以使用未知的处理程序伪造中缀运算符(如在GrAnd的答案中),但与上述相比,这确实非常慢.