eiffel: перемещает ли поперечная структура курсор текущей итерируемой структуры?

Мне было интересно, использует ли сквозная структура собственный курсор или отдельный? гарантирует ли он, что курсор не перемещается, и если да, то как это можно выразить для других примеров?


person Pipo    schedule 26.01.2019    source источник


Ответы (1)


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, заключается в том, что связанная структура не должна изменяться в течение всего хода итерации. Это не теоретическое ограничение, а практическое, чтобы упростить реализацию и сделать ее более эффективной.

person Alexander Kogtenkov    schedule 26.01.2019
comment
Большое спасибо за ваш полный ответ, не могли бы вы добавить что-нибудь о заявлении о гарантии неподвижного курсора? Мне было интересно, достаточно ли ensure cursor = old cursor или мне нужно пройти через cursor.index = old cursor.index - person Pipo; 26.01.2019
comment
@Pipo Все курсоры, созданные для запуска циклов across на ITERABLE, независимы и не влияют друг на друга. Выражение независимости в постусловиях потребовало бы, чтобы курсоры знали друг друга. Это уже слишком. Кроме того, возникает вопрос, может ли перемещение курсора также печатать в консоль, записывать запись в БД, открывать диалог пользователя и т.д. Нам также пришлось бы выражать все эти вещи в постусловии. Это становится неуправляемым и называется проблемой фрейма. Это решается другими средствами, т.е. modify в AutoProof. - person Alexander Kogtenkov; 27.01.2019