Вдохновение и влияние выражения else инструкций циклов?

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

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

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

Связанное обсуждение и примеры: Pythonic способы 'еще' использовать в для цикла

11
задан Community 23 May 2017 в 10:33
поделиться

2 ответа

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

...LOOP предоставляет два ключевых слова, initially и finally, которые вводят код для выполнения вне основного тела цикла.

После initially или finally эти клаузы состоят из всех форм Лиспа вплоть до начала следующего клауза цикла или конца цикла. Все формы initially объединяются в один пролог, который выполняется один раз, сразу после инициализации всех локальных переменных цикла и перед телом цикла. Формы finally аналогично объединяются в эпилог, который выполняется после последней итерации тела цикла. И пролог, и эпилог могут ссылаться на локальные переменные цикла.

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

  • Выполняется предложение возврата.
  • 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 также уникальна. Кто-то однажды спросил, откуда она взялась, и ему указали на статью Кента Питмана, где он говорит, что взял ее из Maclisp. Аналогично, странно выглядящая функция FORMAT в Common Lisp, очевидно, пришла из Multics через Дэна Вайнреба.

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

4
ответ дан 3 December 2019 в 11:20
поделиться

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

Кто-нибудь помнит FOR var… NEXT var … END FOR var Sinclair QL's SuperBasic? Все между NEXT и END FOR будет выполняться в конце цикла, если только EXIT FOR не был изданный. Этот синтаксис был более чистым :)

Распознавание текста Sinclair QL User Guide с оптическим распознаванием текста случайно попадает в Интернет. Он гласит:

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

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

Вот интересный пример:

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

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

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

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

2
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: