Size: a a a

Kotlin Community

2020 September 03

АЕ

Алексей Ершов... in Kotlin Community
Ruslan Ibragimov
В том то и дело что нет. Список блокирующих API известен, и проще их было проаннотировать, чем сейчас 90% функций в проекте содержат в себе suspend 🙂
Это не то же самое, что "функция блокирует тред") Это "блокирует тред надолго". suspend очень чётко определяет контракт функции, а вот обратный модификатор - нет.
источник

RI

Ruslan Ibragimov in Kotlin Community
Vladimir Petrakovich
А как аннотировать все остальные, которые не-suspend и не-блокируют-тред-на-время-IO? (почти все)
Никак, компилятор разберется если там не нужна стейт машина или склеит их. Он и сейчас так умеет afaik
источник

AH

Ayrat Hudaygulov in Kotlin Community
А вот в фшарпе для этого вот-вот дадут возможность юзерам делать стейт-машины для монадического кода
И пользователь сможет сам сказать что вот монаду Async и Seq делать через стейт машину и джамп тейблы, а вот эти монадки через континуейшны
источник

AM

Andrew Mikhaylov in Kotlin Community
Ну вот лум сделает таким образом, и посмотрим, что из этого выйдет :)

Корутина в языке — всё-таки опциональная штука, не все ими пользуются. Мне кажется, так как сделано, сделано хорошо.
источник

RI

Ruslan Ibragimov in Kotlin Community
Andrew Mikhaylov
Ну вот лум сделает таким образом, и посмотрим, что из этого выйдет :)

Корутина в языке — всё-таки опциональная штука, не все ими пользуются. Мне кажется, так как сделано, сделано хорошо.
Лум сделает так что не будет вообще блокирующих API
источник

AH

Ayrat Hudaygulov in Kotlin Community
Ayrat Hudaygulov
А вот в фшарпе для этого вот-вот дадут возможность юзерам делать стейт-машины для монадического кода
И пользователь сможет сам сказать что вот монаду Async и Seq делать через стейт машину и джамп тейблы, а вот эти монадки через континуейшны
в сишарпе стейт машины захардкожены для async/await и yield/IEnumerable
источник

VP

Vladimir Petrakovich in Kotlin Community
Ruslan Ibragimov
Никак, компилятор разберется если там не нужна стейт машина или склеит их. Он и сейчас так умеет afaik
Даже если забыть про совместимость, это не будет так работать.
Сегодня какая-то вызываемая функция не требует стейт-машину (не содержит точек останова), завтра потребует. Что делать вызывающей стороне?
источник

AH

Ayrat Hudaygulov in Kotlin Community
В котлине стейт машины похоже тоже только за суспенд функциями захардкожены.
источник

AM

Andrew Mikhaylov in Kotlin Community
Ну кстати да, добавление саспенд-модификатора к функции — breaking change.
источник

AM

Andrew Mikhaylov in Kotlin Community
Ayrat Hudaygulov
В котлине стейт машины похоже тоже только за суспенд функциями захардкожены.
Да, потому в Arrow и делают ду-нотацию на саспендах.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Andrew Mikhaylov
Да, потому в Arrow и делают ду-нотацию на саспендах.
и это ужасно, что приходится так костылить
источник

AM

Andrew Mikhaylov in Kotlin Community
Предлагаю не начинать холивар, проходили уже много раз :)
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
В котлине стейт машины похоже тоже только за суспенд функциями захардкожены.
Так в этом и суть suspend-функций. Ничего не захардкожено, можешь поверх городить что угодно.
источник

AH

Ayrat Hudaygulov in Kotlin Community
Vladimir Petrakovich
Так в этом и суть suspend-функций. Ничего не захардкожено, можешь поверх городить что угодно.
я посмотрел, там чот сложно всё (в Arrow).
Вот прям так в две строчки не написать монадку на стейт машине
источник

VP

Vladimir Petrakovich in Kotlin Community
Ayrat Hudaygulov
я посмотрел, там чот сложно всё (в Arrow).
Вот прям так в две строчки не написать монадку на стейт машине
Можно посмотреть, как сделаны генераторы
источник

AM

Andrew Mikhaylov in Kotlin Community
Так на саспендах же.
источник

AM

Andrew Mikhaylov in Kotlin Community
С рестриктом с помощью аннотации, что и правда слегка костыльненько.
источник

AM

Andrew Mikhaylov in Kotlin Community
С 1.4 и на DeepRecursiveFunction смотреть можно :)
источник

RI

Ruslan Ibragimov in Kotlin Community
Andrew Mikhaylov
Ну вот лум сделает таким образом, и посмотрим, что из этого выйдет :)

Корутина в языке — всё-таки опциональная штука, не все ими пользуются. Мне кажется, так как сделано, сделано хорошо.
Сейчас опциональная да, но все идет к тому что они везде пролезают и будут куда более востребованы чем работа с thread api. И соответсвенно код становится более вербозный. Я говорю о том что этот дефолт был хорош на старте, но сейчас хочется сделать обратный.

Есть три вида функций:

1. suspend
2. regular
3. blocking

В языке сейчас есть средства только чтобы пометить suspend. И таких функций становится большинство. Соотвественно если теперь suspend это норма, то хотелось бы чтобы

1. suspend fun -> fun
2. regular (fun) -> nosuspend fun (для оптизиций, можно и не вводить такой keyword)
3. blocking (fun) -> blocking fun - те функции которые по каким-то причинам блокируют поток, и их важно не вызвать на основном пуле
источник

AH

Ayrat Hudaygulov in Kotlin Community
Вот RFC, где добавляют возможность делать кастомные юзер стейт машины
https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1087-resumable-code-and-task-builder.md#feature-resumable-state-machines

Местами тоже ад не для средних умов, но хотя бы можно в пару строчек дать указание компилятору генерить тебе джамптейбл
источник