对于其他语言,list元素的自增量非常简单,就像:
list1(i) = list1(i) + 1
但对于tcl,目前我使用:
set temp [lindex $list1 $i];
lset list1 $i [expr $temp + 1];
还有其他方法可以改善它/使其更简单吗?
答案 0 :(得分:4)
使用Tcl列表,我不确定任何内部命令直接增加list元素的值。
但是,如果您通过dict incr
命令在Tcl中使用词典,则可以这样做。
dict incr dictionaryVariable key?increment?
这会添加给定的增量值(如果是,则为默认值为1的整数) 未指定)给定键映射到的值 包含在给定变量中的字典值,写入 结果字典值返回该变量。不存在的密钥 被视为映射为0。增加值是一个错误 对于现有密钥,如果该值不是整数。更新了 返回字典值。
set sample { firstName Dinesh lastName S title Mr age 23}
# This will increase the value of 'age' by 1
puts [ dict incr sample age 2]
# If any key used which does not exits in the dict, then it will create that key
# assume it's initial value is 0.
puts [ dict incr sample dob ]
输出
firstName Dinesh lastName S title Mr age 25
firstName Dinesh lastName S title Mr age 25 dob 1
如果您仍然对使用list元素中的increment感兴趣,那么我们可以为此编写一个新命令,如下所示,
proc lincr { my_list index { increment 1 } } {
upvar $my_list user_list
if { [llength $user_list] <= $index } {
return -code error "Wrong list index"
}
lset user_list $index [ expr {[lindex $user_list $index] + $increment} ]
}
set val { 1 2 3 4 }
lincr val 1 4; # Increasing first index by 4
lincr val 0; #Increasing zeroth index by 1
puts $val
答案 1 :(得分:1)
好吧,您可以使用一个数组,可以将其视为稀疏列表。在这种情况下,Tcl表达式变得非常简单:
incr list1($i)
你似乎在某种程度上认为Tcl表达更加困难&#34;仅仅因为语法与许多其他语言使用的语法不同。你的例子
list1(i) = list1(i) + 1
表示大约&#34;赋值(由i的值表示的list1的成员)(由i的值取消引用的list1的成员)加1&#34;的值,以及以下Tcl表达式表示完全相同:
lset list1 $i [expr {[lindex $list1 $i] + 1}]
看起来不同,它几乎是长度的两倍,并且有两种括号而不是一种,但它仍然是完全相同的表达式。
顺便说一下,顺便说一下(C语言家族):
list1[i] += 1;
/* or */
++list1[i];
或者这个(Lisp家族):
(setf (elt list1 i) (+ (elt list1 i) 1))
; or
(incf (elt list1 i))
所有这些表达式基本上意味着相同的事情,并且导致处理器执行基本相同的指令。这只是您使用的偏好(或管理决策)问题。
对我来说,Tcl在整体上要容易得多,因为它给了我很少其他语言可以给我的自由和力量。
答案 2 :(得分:0)
一衬垫:
CODE:
seg.arrData := nil;
if seg.iLength > 0 then
begin
SetLength(seg.arrData, seg.iLength);
formMain.client.IOHandler.ReadBytes(TIdBytes(seg.arrData), seg.iLength, False);
end;
最佳做法是在这种情况下使用数组,如前所述。