ITERABLE
использует так называемые внешние курсоры, а не внутренние, объединенные с базовой структурой. В результате итерация не влияет ни на структуру, ни на любой другой курсор, созданный таким же образом. Это важно для поддержки вложенных или рекурсивных итераций. Например, чтобы найти дубликаты, можно сделать следующее:
across structure as i loop
across structure as j loop
if i.item = j.item then print ("Duplicates found.") end
end
end
То же самое с внутренними курсорами, например ( примечание: код неверный )
from structure.start until structure.after loop
x := structure.item
from structure.start until structure.after loop
if x = structure.item then print ("Duplicates found.") end
structure.forth
end
structure.forth
end
не работает, потому что внутренний цикл также меняет курсор внешнего цикла.
Ограничение курсоров, связанных с ITERABLE
, заключается в том, что связанная структура не должна изменяться в течение всего хода итерации. Это не теоретическое ограничение, а практическое ограничение для упрощения реализации и повышения его эффективности.