4 ms·
There are quite a few things in Kotlin which are not possible in Java * Top level declarations * Sealed classes * Coroutines (in Java this is currenty only p
by oweiler 9y ago
There are quite a few things in Kotlin which are not possible in Java
* Top level declarations
* Sealed classes
* Coroutines (in Java this is currenty only possible with Bytecode manipulation)
* Inlined Functions and Reified Generics
* Covariant Collections
* Tail Recursion
- _Codemonkeyism 9y agoI do not argue that Kotlin is a nicer and a language with more features that are useful. What of these would you call "more expressive"? I'd agree with sealed classes, they express a limited set of possible classes. Perhaps tail recursion as I can express problems in way of recursion without stack overflows. I don't think coroutines are more expressive than Futures/get, only a runtime optimization for many concurrent executions.
- joshuamorton 9y agoAsync/await coroutines (C#, python, ECMAscript 7) are much nicer than futures, at least ime. I think that in terms of expressiveness of async code it goes callbacks -> futures/promises -> coroutines Because callbacks are a completely different style of code, your async looks totally different. Futures and promises are better, but still make it difficult to ever break out of the async context, coroutines make the difference between async and normal code nonexistant, and allow clean escape from an async context.
- rbobrowicz 9y ago>Tail Recursion Interesting. I thought the lack of proper tail recursion is a JVM limitation. Hence why Clojure uses loop/recur to handle it by translating it to a loop rather then as an actual tail call. Which means things like mutually recursive functions are not possible in Clojure without blowing the stack. How does Kotlin handle that? Is it internally rewriting to a loop or trampoline, or did they find some way to actually make proper tail calls?
- calcifer 9y ago> Is it internally rewriting to a loop Yes. You add a `tailrec` modifier to your function. The compiler then checks if the last op in the function is a call to itself. If it is, it gets replaced with a loop. If not, you get a warning that `tailrec` is ignored.
- calcifer 9y ago> Reified Generics It's implemented with some bytecode hackery and hence limited to inlined functions [0], which makes it significantly less useful. Funny how a misguided design decision from the Java 1.5 days (running generic 1.6 code with a 1.5 jre) still haunts us today... [0] https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters https://kotlinlang.org/docs/reference/inline-functions.html#...
- _Codemonkeyism 9y agoSee "Brian Goetz - Stewardship: the Sobering Parts" https://www.youtube.com/watch?v=2y5Pv4yN0b0&t=3399s https://www.youtube.com/watch?v=2y5Pv4yN0b0&t=3399s