例如,在Perl中,要获得从1到10的连续数字数组,您可以这样做:
@myArray = (1 .. 10);
这两个句点用作此操作的简写,而不是进行for循环或手动编写整个事物。我用过的其他语言也有类似的东西。
Tcl中是否存在类似的简写?
答案 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]"