Вдохновение и влияние предложения else операторов цикла?

Операторы цикла Python могут иметь предложение else, которое выполняется тогда и только тогда, когда цикл не завершается символом break. Другими словами, когда условие становится Falsewhile) или когда итератор исчерпан (с for).

Создана ли эта конструкция loop-else с другого языка (теоретическая или фактически реализована)? Был ли он рассмотрен на любом более новом языке?

Может быть, я должен спросить первого из Гвидо, но, конечно, он слишком занят для такого бесполезного расследования.; -)

Связанное обсуждение и примеры: Питонические способы использования else в цикле for

Ответ 1

Аналогичная функция встречается в Common Lisp макросе LOOP, описанном здесь Питером Сейбелем:

... LOOP предоставляет два ключевых слова, изначально и, наконец, ввод кода, который должен выполняться вне основного тела цикла.

После изначально или, наконец, эти предложения состоят из всех форм Lisp вплоть до начала следующего предложения цикла или конца цикла. Все изначально формы объединяются в один пролог, который выполняется один раз, сразу после того, как все локальные переменные цикла инициализируются и перед телом цикла. Наконец, формы аналогично объединены в эпилог, который будет запущен после последней итерации тела петли. Оба кода пролога и эпилога могут ссылаться на переменные локального цикла.

Пролог всегда запускается, даже если тело цикла выполняет итерацию нулевого раза. Цикл может вернуться без запуска эпилога, если произойдет одно из следующих событий:

  • Выполняется предложение return.
  • RETURN, RETURN-FROM или другая передача управляющей конструкции вызывается из формы Lisp внутри тела...

Например, часть образца Python, найденная в связанном вопросе:

for v in known_variables:
    if self.bindings[v] is cell:
        return v
else:
    raise CannotSimplify

может выглядеть примерно так:

(loop for v in known-variables
  when (eq (gethash v (slot-value self bindings)) cell)
  do (return v)
  finally (signal cannot-simplify))

Другое наблюдение:

Общая система условий Lisp также уникальна. Кто-то, однажды, спросил, откуда он появился, и был указан на Kent Pitman paper, где он говорит, что получил его от Maclisp. Аналогично, Common Lisp странная функция FORMAT, по-видимому, поступала из Multics через Dan Weinreb.

Общей нитью является то, что языковые функции не имеют тенденций следовать за языком предков, которые больше всего вдохновили этот язык, но воспринимаются людьми, которые любили их на любом новом языке, над которым они работают. Поэтому, если вы хотите узнать фактический источник Python for - else, я бы поискал, кто его добавил, и посмотрите, на каком языке они работали до этого.

Ответ 2

Я просто наткнулся на довольно хорошее руководство, заложенное в комментариях этого гораздо более общего вопроса. Пользователь ΤΖΩΤΖΙΟΥ писал (а):

Кто-нибудь помнит FOR var... NEXT var... END ДЛЯ var of Sinclair QL's Суперосновный? Все между NEXT и END FOR выполнит в конце цикла, если только EXIT FOR не был выпущен. Этот синтаксис был более чистым:)

Выполнение OCR для Sinclair QL User Guide происходит в Интернете. Он гласит:

Оператор NEXT может быть помещен в петля. Это приводит к тому, что контроль переходит к который сразу после открытие ключевого слова FOR или повторное воспроизведение. Это следует рассматривать как своего рода напротив инструкции EXIT. Посредством любопытное совпадение, два слова NEXT и EXIT содержат EXT. Думать от EXTension до циклов и:

  • N означает "Теперь начать снова"
  • Я имею в виду "Это закончилось"

Увлекательный пример:

У шерифа есть пистолет, нагруженный шестью пули, и он должен стрелять по бандит, но применяются еще два условия:

  • Если он ударит по бандиту, он остановится стрельба и возвращение в Додж-Сити.

  • Если у него заканчиваются пули, прежде чем он ударит бандит, он говорит своему партнеру смотреть бандит, пока он (шериф) возвращается в Додж-Сити.

100 REMark Western FOR with Epilogue
110 FOR bullets = 1 TO 6
120   PRINT "Take aim"
130   PRINT "FIRE A SHOT"
140   LET hit= RND(0 TO 1)
150   IF hit = 1 THEN EXIT bullets
160 NEXT bullets
170   PRINT "Watch Bandit"
180 END FOR bullets
190 PRINT "Return to Dodge City"

Итак, под другим (и, возможно, менее тревожным) синтаксисом это точно та же семантика.

Википедия сообщает нам, что Sinclair QL запущен в феврале 1984 года как преемник Sinclair ZX Spectrum, но не смог добиться коммерческого успеха.