Я бы использовал цикл for
:
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
}
Преимущество этого состоит в том, что, во-первых, существует ограничение на физическую невозможность (нет смысла дробить робота на куски!), А во-вторых, выполнение итерации с целыми числами. Этот второй момент имеет жизненно важное значение: двоичные числа с плавающей запятой - это непростые вещи, особенно когда речь идет об итерации по 0,1, а Tcl (как и многие другие языки) использует внутреннюю арифметику с плавающей запятой IEEE. Способ избежать этих проблем состоит в том, чтобы выполнять итерации с целыми числами и иметь немного кода для преобразования в число с плавающей запятой (например, путем деления на 10). Думайте с точки зрения борьбы с обратным отсчетом в единицах 0,1. : -)
Еще одна менее значимая стилистическая точка. Положите {
фигурные скобки }
круглых выражений, поскольку это повышает безопасность и производительность. (Повышение производительности происходит потому, что среда выполнения знает, что у нее не может быть странных фрагментов выражений, которые также считаются небезопасными. Не то, чтобы это критично в этом коде из-за зависимости от аппаратного обеспечения сервосистемы, но это хорошая привычка попасть в.)