例如,在Perl中,要获得从1到10的连续数字数组,您可以简单地执行以下操作:
@myArray = (1 .. 10);
Run Code Online (Sandbox Code Playgroud)
这两个句点用作此操作的简写,而不是进行for循环或手动编写整个事物.我用过的其他语言也有类似的东西.
Tcl中是否存在类似的简写?
不是这个,但是
% 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"关键字,看看如何使用单行完成此操作.
您可以定义方法:
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)
:)
除了表达式(它们是他们自己的小语言)之外,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的答案中),但与上述相比,这确实非常慢.
| 归档时间: |
|
| 查看次数: |
3393 次 |
| 最近记录: |