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