Общая структура формы do выглядит следующим образом:
(do ((<variable1> <init1> <step1>)
...)
(<test> <expression> ...)
<command> ...)
Перефразируя http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-6.html#node_chap_5, каждая итерация начинается с оценки <test>
, если она оценивается как истинное значение, <expression>
s оцениваются слева направо и последнее значение, если результат формы do
.Во втором примере =
будет оцениваться как логическое значение true, тогда я буду оцениваться и, наконец, 5 будет возвращаемым значением формы.В первом случае (= i 5)
является тестом, а форма do
возвращает неопределенное значение.Обычный способ написания цикла будет выглядеть примерно так:
(do ((i 0 (+ i 1)))
((= i 5) i) ; maybe return the last value of the iteration
(display i))
Вам не нужна явная мутация переменной цикла, поскольку это обрабатывается выражением <step>
.