Size: a a a

Programming Offtop

2020 September 19

QH

Quantum Harmonizer in Programming Offtop
откатился, ибо новый инференс уходил в вечный цикл
источник

I

Ilmir in Programming Offtop
Bogdan Panchenko
хорошо, экспериментальные фичи как изменились в 1.4 ? а то ты говоришь завезли, проверили, исправили, а по факту то как ?
Контракты те же. Вот моё нытье коллеге из библотечной команды
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?

>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
источник

QH

Quantum Harmonizer in Programming Offtop
Ilmir
Контракты те же. Вот моё нытье коллеге из библотечной команды
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?

>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
> val инстанциировать из лямбды
инициализировать жеж
источник

I

Ilmir in Programming Offtop
Quantum Harmonizer
> val инстанциировать из лямбды
инициализировать жеж
Ну да.
источник

I

Ilmir in Programming Offtop
Quantum Harmonizer
откатился, ибо новый инференс уходил в вечный цикл
Отрепортил?
источник

QH

Quantum Harmonizer in Programming Offtop
Ilmir
Контракты те же. Вот моё нытье коллеге из библотечной команды
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?

>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
я вчера, кстати, уебался об очень странную проблему.
inline fun x(f: X.() -> Unit) { // calls in place EXACTLY ONCE

окей, x { someXVal = it } работает
добавляю в лямбду другой функциональный параметр — не работает
источник

BP

Bogdan Panchenko in Programming Offtop
Ilmir
Контракты те же. Вот моё нытье коллеге из библотечной команды
> привет, а можешь пожалуйста объяснить, почему архитектурно было сделано так, что добавление контракта изменяет кодогенерацию кода, который свойствами контракта не пользуется?

>> Добавление контракта меняет анализ кода, который меняет кодогенерацию. Например, чтобы можно было val инстанциировать из лямбды, которая не инлайнится, вместо val'a генерируется обертка и с точки зрения бекенда - это уже другой тип. Но в случаях, когда нельзя поменять тип (например, переменная - это исключение), это, разумеется не работает. Что и привело к падениям.
Это, кстати, хак, который я когда-то реализовал (поддержка инициализации val'ов в лямбде, которая не инлайнится), потому что возможность ставить контракты на не-inline функциях привела к багу в инлайнере и конкретно тогда было проще сделать хак. Я планировал его убрать, когда во фронтенде запретят ставить контракты на не-inline функциях. Будущее оказалось довольно-таки неожиданным. Хак расцвел и пустил корни.
:twist: - моё лицо, когда ты написал про добавление контрактов к билдерам.
ну то-есть мои опасения потверджуються. надеюсь 1.5 будет +- норм хоятяб на уровне 1.3
источник

QH

Quantum Harmonizer in Programming Offtop
Ilmir
Отрепортил?
Дважды. Когда IDE фризилась (это я ещё в Яндексе работал, т. е. полгода назад было дело) и недавно, уже в 1.4.
источник

I

Ilmir in Programming Offtop
Bogdan Panchenko
ну то-есть мои опасения потверджуються. надеюсь 1.5 будет +- норм хоятяб на уровне 1.3
Наивный человек. 1.4 вроде как вышел стабильнее 1.3. Фич меньше, в основном инфраструктурный релиз.
источник

I

Ilmir in Programming Offtop
Но да, я тоже надеюсь, что 1.5 выйдет стабильнее 1.4
источник

I

Ilmir in Programming Offtop
Quantum Harmonizer
я вчера, кстати, уебался об очень странную проблему.
inline fun x(f: X.() -> Unit) { // calls in place EXACTLY ONCE

окей, x { someXVal = it } работает
добавляю в лямбду другой функциональный параметр — не работает
Так-с. А с этого момента, пожалуйста, по-подробнее.
источник

BP

Bogdan Panchenko in Programming Offtop
Ilmir
Наивный человек. 1.4 вроде как вышел стабильнее 1.3. Фич меньше, в основном инфраструктурный релиз.
> фичь меньше
> лучше

ну да ну да, ну я вообще про другое. Мои опасения ты потвердил спасибо тебе за это)
источник

QH

Quantum Harmonizer in Programming Offtop
Ilmir
Так-с. А с этого момента, пожалуйста, по-подробнее.
пойду воспроизведу
источник

QH

Quantum Harmonizer in Programming Offtop
Ilmir
Так-с. А с этого момента, пожалуйста, по-подробнее.
достаточно один параметр добавить — и пипец
источник

QH

Quantum Harmonizer in Programming Offtop
для копипаста:
class Smth {
 val whatever: Int
 init {
   calculate({ whatever = it }, 1)
 }
 @OptIn(ExperimentalContracts::class)
 private inline fun calculate(
   block: (Int) -> Unit, oneMore: Int
 ) {
   contract {
     callsInPlace(
       block,
       InvocationKind.EXACTLY_ONCE
     )
   }
   block(0)
 }
}
источник

BP

Bogdan Panchenko in Programming Offtop
Quantum Harmonizer
достаточно один параметр добавить — и пипец
найдешь ишью ? подержу)
источник

I

Ilmir in Programming Offtop
Quantum Harmonizer
достаточно один параметр добавить — и пипец
БЛЯДЬ! Такая дурацкая и детская ошибка.
источник

QH

Quantum Harmonizer in Programming Offtop
источник

I

Ilmir in Programming Offtop
Там проблема не в доп параметре, а в скобках вокруг лямбды.
источник

QH

Quantum Harmonizer in Programming Offtop
Ilmir
Там проблема не в доп параметре, а в скобках вокруг лямбды.
блин, хочется какой-то более высокоуровневый PSI, в котором не нужно отдельно обрабатывать argumentList, а отдельно lambdaArgument
источник