В постусловии, которое не выполняется, курсоры цикла i_twin
и i_orig
выполняют итерации по последовательностям 2 .. array.count
и 1 .. array.count - 1
соответственно, т.е. их элементами являются индексы 2, 3, ...
и 1, 2, ...
.Итак, цикл выполняет сравнения 2 ~ 1
, 3 ~ 2
и т. Д. (Во время выполнения останавливается на первом неравенстве).Однако вы хотите сравнить элементы, а не индексы.
Ниже показано одно из возможных решений:
items_shifted:
across array as c all
c.item =
if c.target_index < array.upper then
(old array.twin) [c.target_index + 1]
else
old array [array.lower]
end
end
Цикл проверяет, что все элементы смещены.Если курсор указывает на последний элемент, он сравнивает его со старым первым элементом.В противном случае он проверяет, равен ли текущий элемент старому элементу при следующем индексе.
Косметика:
Постусловие не предполагаетчто массив начинается с 1 и использует вместо него array.lower
и array.upper
.
Постусловие не выполняет глубокую двойку исходного массива.Это позволяет сравнивать элементы, используя =
, а не ~
.
Редактировать: Чтобы избежать возможной путаницы, вызванной правилами приоритета, и подчеркнуть, что сравнениевыполненный для всех элементов между старым и новым массивом, лучший вариант, предложенный Эриком Безо, выглядит так:
items_shifted:
across array as c all
c.item =(old array.twin)
[if c.target_index < array.upper then
c.target_index + 1
else
array.lower
end]
end