Могу ли я запустить сопрограмму, используя чистый котлин, без импорта каких-либо библиотек (какими бы уродливыми это ни были)?
Нет. Все генераторы сопрограмм находятся в библиотеке kotlinx.coroutines
, так что вам понадобится как минимум это. Теперь, очень теоретически, вы можете переопределить эту функцию самостоятельно. Но, вероятно, вы не должны.
Как это можно сделать, слишком долго для ответа StackOverflow, но попробуйте вызвать метод этого класса Kotlin из Java:
class AsyncWorks {
suspend fun print() {
println("Hello")
}
}
Вы увидите, что, хотя метод Kotlin имеетбез аргументов, в Java это требует Continuation<? super Unit>
. Это то, что делает ключевое слово suspend
. Он добавляет Continuation<T>
в качестве последнего аргумента нашей функции.
не лучше ли было бы реализовать обе функции библиотеки или обе функции компилятора?
В идеале вы бы хотели, чтобы все было "библиотечной функцией""так как легче развиваться. Удалить ключевое слово из языка очень сложно. Теоретически, можно использовать suspend
в качестве ключевого слова. Quasar , будучи фреймворком, вместо этого использует аннотации. Язык программирования Go, с другой стороны, предполагает, что все функции приостановлены. Все эти подходы имеют свои преимущества и недостатки.
Котлин решил быть прагматичным и добавил ключевое слово suspend
, оставив решение за разработчиками. Если вам интересна эта тема, я настоятельно рекомендую этот доклад Романа Елизарова, автора котлинских сопрограмм, который объясняет их решения: https://www.youtube.com/watch?v=Mj5P47F6nJg