<@U092308M7> Я тут немного подумал на тему того, а...
# russian
a
@orangy Я тут немного подумал на тему того, а что могло бы существенно способствовать продвижению Kotlin в научной среде. Как я уже говорил, конкурировать с Python довольно сложно. Он динамический и свою нишу оккупирует довольно прочно. Но в принципе Kotlin мог бы существенно потеснить С++ в смысле расчетов, где требуется высокая скорость. Уже сейчас на Kotlin JVM можно писать высоко производительные научные вычисления (что мы и делаем), но многие научные библиотеки существую в Fortran/C/C++ экосистеме, так что с ними довольно сложно взаимодействовать из JVM. Когда будет готов Kotlin native и если будет бесшовный мост между Kotlin native и Kotlin JVM, на мой взгляд это был бы очень существенный сдвиг в смысле программирования для науки.
o
Да, это вполне понятно, мы работаем над этим. Вот как раз @thomasnield что-то затевал, но пока не знаю, что у него получилось.
a
Пока я думаю, что и чистый Kotlin-jvm - это очень хороший вариант для науки, но научное сообщество очень инертно, вряд ли этим удастся быстро заинтересовать широкие массы.
Я пока упражняюсь только на своей научной группе.
У меня в основном люди с серьезным опытом в программировании и им идея kotlin весьма интересна. Физики более старшего поколения категорически отказываются уходить куда-то с насиженных мест.
o
В твиттере регулярно пишут люди от науки, что Kotlin – это как питон, только типизированный и на JVM 🙂
a
Собственно, это примерно то, что я хочу получить, но тут надо понимать, что все основные достоинства питона и все его основные недостатки именно от динамической типизации. Так что совсем как питон не будет. Вот groovy, да, как питон. Он даже быстрее, но все равно не смогу захватить нишу.
В Котлин главная прелесть именно в статической типизации.
e
Прелесть не в самой типизации, а в тулинге, который получается как её следствие -- осмысленные контекстно-зависимые подсказки о том, какие операции где можно делать.
a
Разумеется. Ещё расширения. На мой взгляд, их потенциал ещё не до конца раскрыт. Возможность контролируемым статическим образом добавлять методы в класс в зависимости от контекста - это что совершенно новое. Мне кажется, что для полного счастья всё-таки не хватает member extensions вне класса.
Похоже сегодня не судьба, я совсем разболелся. А где можно подписаться, чтобы в следующий раз такое собрание не пропустить?
r
@altavir а почему не Swift?
там вроде есть member extensions
a
Swift для науки вообще не годится просто по той причине, что для него нет научных библиотек. Это я уже не говорю о кросс-платформенной поддержке. В Kotlin есть member extensions, но пока нет синтаксиса для того, чтобы декларировать их вне этого самого member.
r
можно пример?
a
s
но пока нет синтаксиса для того, чтобы декларировать их вне этого самого member.
@altavir Но ведь если их делкарировать отдельно, то и семантика у них будет другая, нет? Внутри класса они резолвятся динамический (т.е. их можно переопределять в наследниках). Вне класса такое можно сделать только через какой нибудь invokedynamic, что затратно. Можете скинуть ссылку на тему в форме, почитать?
a
https://discuss.kotlinlang.org/t/declare-member-extensions-outside-the-class/6759/9 Но вы не правы, они резолвятся статически. С точки зрения JVM - это просто статические функции, которые подставляются во время вызова.
s
Если речь идет про extension методы внутри класса, то они резолвятся динамический по this класса в котором определены
например так работает бибилиотека для реакта. Там переопределятся метод RBuilder.render внутри компонентов
Copy code
class A {
  abstract fun Int.a(): Int 
}

class B: A {
  override fun Int.a(): Int = 1
}
Copy code
open class A {
  open fun Int.a(): Int = 0
  fun test() = 10.a()
}

class B: A() {
  override fun Int.a(): Int = 1
}

fun main(args: Array<String>) {
  val x: A = B()
  println(x.test())
}
напечатает
1
С точки зрения JVM - это просто статические функции, которые подставляются во время вызова.
Возможно вы путаете с extension методами вне класса. Все exntesions методы объявленные внутри класса компилируются в овычные (динамические) ява методы, которые можно переопределить в подклассах (разумеется если они open). Второй рисивер резолвиться статический, да
a
Возможно. В таком случае, определение member extensions вне класса действительно не такая простая задача.
a
Да, я читал. Насколько я понимаю, все то же самое.