Tcl 我怎样才能使这个过程更优雅?

Tcl 我怎样才能使这个过程更优雅?,tcl,Tcl,我控制着一个伺服装置,它将一个物体越来越靠近传感器,试图触发它 我希望这段距离从15点5分开始。但是,在每次迭代中,我希望它减少距离。1,直到传感器触发。为了方便起见,我想退出while循环,将变量$currentHeight设置为这个触发高度,因此我将递减线放在循环的开始处 但是,我必须在while循环之前硬编码一个15.6的起始点,以便它在循环的第一行中减少到15.5 那看起来不太优雅。有没有关于如何美化这个的建议? 顺便说一句,这是Tcl,面向所有老派和默默无闻的程序员。;) 代码: 我不

我控制着一个伺服装置,它将一个物体越来越靠近传感器,试图触发它

我希望这段距离从15点5分开始。但是,在每次迭代中,我希望它减少距离。1,直到传感器触发。为了方便起见,我想退出while循环,将变量$currentHeight设置为这个触发高度,因此我将递减线放在循环的开始处

但是,我必须在while循环之前硬编码一个15.6的起始点,以便它在循环的第一行中减少到15.5

那看起来不太优雅。有没有关于如何美化这个的建议? 顺便说一句,这是Tcl,面向所有老派和默默无闻的程序员。;)

代码:


我不知道Tcl,但它可能看起来像这样:

set currrentDistance 15.5
set sensorStatus 4

while {true} {
    moveServo $currentHeight
    set sensorStatus [watchSensor 2]

    if {$sensorStatus == 1} then {break};

    set currentDistance [expr $currentDistance - .1]
}
我会使用一个循环:

这样做的好处是,首先对物理上的不可能性有一个限制(将机器人磨成碎片毫无意义!),其次是用整数进行迭代。第二点很重要:二进制浮点数是很棘手的事情,特别是当涉及到0.1的迭代时,Tcl(与许多其他语言一样)在内部使用IEEE浮点算法。避免这些问题的方法是使用整数进行迭代,并使用一些代码转换为浮点(例如,除以10)。考虑以0.1为单位进行倒计时。:-)


另一个次要的风格点。将
{
大括号
}
放在表达式周围,因为它可以提高安全性和性能。(性能提升是因为运行时知道它不能有奇怪的表达式片段,这也是不安全的。这在代码中不是很重要,因为它依赖于伺服硬件,但这是一个好习惯。)

这永远不会进入循环,因为sensorStatus!=1.initially@glenn:除非它是链接到某些内存映射硬件的变量,或在其上设置了跟踪。那太难看了。我不得不更改一些识别信息,结果看起来我的编辑不正确。不过,基本前提适用。:)假设它能进入循环谢谢你的回答Donal。
set currrentDistance 15.5
set sensorStatus 4

while {true} {
    moveServo $currentHeight
    set sensorStatus [watchSensor 2]

    if {$sensorStatus == 1} then {break};

    set currentDistance [expr $currentDistance - .1]
}
for {set d 155} {$d > 0} {incr d -1} {
    set currentDistance [expr {$d * 0.1}]

    moveServo $currentHeight
    set sensorStatus [watchSensor 2]
    # If we've found it, stop searching!
    if {$sensorStatus == 1} break
}