Вдохновение и влияние предложения else для операторов цикла? - PullRequest
11 голосов
/ 28 мая 2010

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

Происходит ли эта петлевая конструкция из другого языка (теоретического или фактически реализованного)? Это было взято на новый язык?

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

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

Ответы [ 2 ]

4 голосов
/ 28 мая 2010

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

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

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

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

  • Выполняется предложение возврата.
  • 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))

Еще одно наблюдение:

Система условий Common Lisp также уникальна. Кто-то однажды спросил, откуда он взялся, и ему указали документ Кента Питмана , где, по его словам, он был получен от Маклиспа. Точно так же странно выглядящая функция FORMAT в Common Lisp явно пришла из Multics через Dan Weinreb .

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

2 голосов
/ 28 мая 2010

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

Кто-нибудь помнит, что FOR… NEXT var … КОНЕЦ ДЛЯ var Sinclair QL's Суперосновный? Все между СЛЕДУЮЩИМ и END FOR будет выполняться в конце цикла, если EXIT FOR не был выпущен. Этот синтаксис был чище:)

Представление OCR руководства пользователя Sinclair QL происходит в Интернете. Читается:

СЛЕДУЮЩИЙ оператор может быть помещен в петля. Это вызывает контроль, чтобы перейти к заявление, которое сразу после открывающее ключевое слово FOR или REPeat. Это следует рассматривать как своего рода напротив утверждения EXIT. По Любопытное совпадение двух слов NEXT и EXIT оба содержат EXT. Считать РАСШИРЕНИЯ на петли и:

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

Интересный пример:

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

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

  2. Если у него кончились пули, прежде чем он попадет в бандит, он говорит своему партнеру смотреть бандит, пока он (шериф) возвращается в Dodge City.

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, но не смог добиться коммерческого успеха.

...