Агитка (Котлин)

necauqua

когда-то был anti344
Администратор
1,216
27
172
kotlin_800x320.png


Агитка от самих JetBrains - https://kotlinlang.org/
Попробовать онлайн(тоже весьма агитка) - http://try.kotlinlang.org/

Котлин - это такой относительно новый язык на основе JVM от JetBrains (которые сделали нам интеллиджу).

Так вот, суть его в том, что он совмещает в себе всё самое хорошее от Java и Scala где из первой берёт читабельность, а из второй - божественно короткий и практичный синтаксис.

О, самое главное и непривычное - nullable types. В котлине нельзя просто присвоить переменной типа String значение null - для этого тип должен быть String? и компилятор будет заставлять вас делать проверки, если вы хотите использовать String, но у вас есть String?
К этому бысто привыкаешь и этого начинает даже не хватать в жабке.
Кстати они совместимы с теми @Nullable аннотациями, что недавно начал завозить фордж, так-что да.
Важно - если вылетает непонятное исключение связанное с котлином, наверняка вы переопределили какой-то метод с типом без ?, а потом вызвали (не вы ибо компилятор блюдит, а майн/фордж) этот метод с тем параметром как null.

Проще говоря - это как значительно сокращённая (синтаксически, функционально он весьма богат) жабка, у которой нету заворотов и СЛОЖНАСТИ скалки, ну есть один очень удобный заворот - эти самые nullable типы.

Научится и перейти на него с жабки несложно, проще чем на скалку, а со скалки вообще легкотня.

Если вы хотите сделать основной класс мода, то, как и в скалке, можно это сделать либо с классом, либо с объектом(да, в Котлине есть объекты которые почти как в скалке(отличие только в объектах-компаньонах, если кто разбирается)).

С классом вообще просто - точно так-же как и в жабке (в фордже нету modLanguage="kotlin", да и не нужен, ну для класса по крайней мере) делаем аннотации типа @Mod и @EventHandler.

Для объекта нужно немного считерить. Если мы навешаем просто @Mod, то фордж будет пытаться рефлексией создать его объект (который кстати запихивает в поля @Instance, если вдруг кому он нужен), что нехорошо. Благо в фордже предусмотрели желание извращенцев самим создавать объекты класса и завезли аннотацию @InstanceFactory, которая вешается на статик метод в классе, который возвращает объект класса.
Однако есть маленькая проблема - в Котлине нет статиков, и, как и в скалке, нужно юзать объекты. Но, к счастью, джет-мозги решили, что если очень хочется, то статик может быть (вообще это для совместимости с жабкой, чтоб писать либы для неё, у них же типа совместимость вообще около 100%).
Делается это аннотацией @JvmStatic на нужном методе, который находится в объекте(насчет методов в классах не уверен, кстати, не проверял).
Итого, смысл в том, что для того чтобы Фордж воспринял наш объект как свой родной, нужно всего-лишь добавить где-нибудь внизу такой метод:
Код:
@InstanceFactory
@JvmStatic
fun hack(): ModObject = this

Кстати таким образом (ну и в скалке тоже, разумеется) можно просто использовать ModObject там, где вам нужен инстанс мода, без использования аннотации @Instance

P.S. Если хотите аннотации на поля, типа @SidedProxy, то нужно над полем писать @field:SidedProxy - особенности полей класса котлина крч(у них там есть просто такие штуки, как в C# - property, типа можно под полем ему геттер-сеттер запилить сразу) - ну и как в скалке геттеры-сеттеры пилить не надо, ибо он сам их пилит и использует (причём пилит не field() и field_$eq(x), а getField() и setField(x), как груви, что удобнее)
 
332
4
А зачем оно если есть джава?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
-_-
Божественный вопрос xD
Перед тем как распинаться, ты видел джаву, а видел его? Или там скалку?

Оно короче(рили короче, сколько лишнего нужно в жабе писать), удобнее и красивее. Крч я никого ни к чему не принуждаю, этожи агитка
 
332
4
ну джаву я видел, а больше ничего видеть не хочу)
 
1,239
2
24
Прежде чем садится за котлин надо джаву хорошо знать. ну синтаксис хотя бы знать. я вот щас учу,все довольно просто
 
332
4
Dahaka написал(а):
Heitem написал(а):
ну джаву я видел, а больше ничего видеть не хочу)

Слабый

Ну я еще питон знаю...
ЫЫ
Лазать по сайтам/книгам лень было, прям с оффициальной документации с английского парсил. ЖЕСТКО БЫЛО. А конкретно Tutorial
 
7,099
324
1,509
XuPuPG написал(а):
Прежде чем садится за котлин надо джаву хорошо знать. ну синтаксис хотя бы знать. я вот щас учу,все довольно просто

Какая разница, какой язык учить сначала?
 
1,137
5
3
Большая. В документации Котлина ничего о стирании типов не написано. Но ты должен это знать, ибо там упоминается. А чтобы узнать, надо прочесть доки.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Котлин может как Clojure, только не в лисповом виде а прост.
Ну к примеру я могу сделать такое
Код:
myOwnIf(condition) {
  println("lol")
} myOwnElse {
  println("else lol")
}
В нём буквально несколько средней продвинутости вещей, которые позволяют делать с ним прост почти всё, но не скатываться ни в сложность скалки, ни в тяпляпность груви
 
1,137
5
3
Лямбды. Вдобавок с extension function. Не особо сложно такое сделать.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
wilah написал(а):
Большая. В документации Котлина ничего о стирании типов не написано. Но ты должен это знать, ибо там упоминается. А чтобы узнать, надо прочесть доки.

Да, он позиционируется именно как ответвление Жабы, то бишь вы должны более-менее знать подкорку жабы, ибо в нём много пересечений с ней (они вообще утверждают, что у него ещё и 100% совместимость, чему я кстати склонен верить)
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
wilah написал(а):
Лямбды. Вдобавок с extension function. Не особо сложно такое сделать.

Ну да. Ещё инфикс + лямбда в конце что-бы свой else был. А вот экстеншнов там как раз таки не было :V
 
1,137
5
3
myOwnIf может возвращать объект, у которого будет экстеншн myOwnElse. Но тот должен быть инфиксным, да
 
398
4
7
Necauqua написал(а):
Котлин может как Clojure, только не в лисповом виде а прост.
Ну к примеру я могу сделать такое
Код:
myOwnIf(condition) {
  println("lol")
} myOwnElse {
  println("else lol")
}
В нём буквально несколько средней продвинутости вещей, которые позволяют делать с ним прост почти всё, но не скатываться ни в сложность скалки, ни в тяпляпность груви

А на Tcl это вообще элементарно:

Код:
proc myOwnIf {arg command} {
    if {$arg == 55} {eval $command}
}

myOwnIf 44 {puts {arg != 55}}
myOwnIf 55 {puts {arg == 55}}
Собственно там аналогичным образом все команды работают.

Я тут думаю то ли на ассемблере код переписывать, то ли с intrinsic функциями попробовать... какой уж тут котлин.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
О даааа!!1!

Однако, мы о майнкруфте, а он хочет как минимум JVM.

P.S.
Код:
inline fun myOwnIf(cond: Boolean, body: () -> Unit) {
    if(cond) body()
}

// или

inline fun myOwnIf(cond: Boolean, body: () -> Unit): If {
    if(cond) body()
    return If(cond)
}

class If(private val cond: Boolean) {
    
    infix inline fun myOwnElse(body: () -> Unit) {
        if(!cond) body()
    }
}
 
1,137
5
3
Круто, конечно, но зачем это? А методы с лямбдами лучше инлайнить. Не всегда, но тут лучше заинлайнить
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
О, тут точно да, спасибо

А эта штука эт прост пример, как можно пилить статически типизированные DSL-ки
 
Сверху