amarao: (Default)
[personal profile] amarao
Чем больше я про это думаю, тем больше я его хочу.

Любое замыкание (в расте) может управлять control flow приложения, но только в смысле panic!. Замыкание не может управлять другим control flow, например, break/continue/return.

Это делает не экивалентным цикл итератора и применение map для того же самого итератора. Несправедливо! Если бы только компилятор понимал управление control flow и мог правильно проверить его совместимость...

Date: 2024-05-24 04:27 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Семантика цикла в верхнем примере — поиск с ранним выходом при успехе и ранним осознанием облома. Соответственно, его надо выражать не в базисе map/filter, а в базисе map/filter/take 1.

Не тестировал, но что-то такое:

NotFound = object()
Break = object()
Continue = object()

def find(xs, sample) -> TypeFoo:
    z = next((y
              for x in xs
              if Continue != (y := (x.make_foo(sample) if x.should_return(sample) else
                                    Break if x.should_stop(sample) else
                                    Continue))),
             NotFound)
    return {NotFound: TypeFoo, Break: TypeFoo}.get(z, lambda: z)()

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 01:12 pm
Powered by Dreamwidth Studios