Your SlideShare is downloading. ×
0
The Kotlin  Programming Language <ul><li>Dmitry Jemerov </li></ul><ul><li>JetBrains GmbH </li></ul>
What is JetBrains?
What is Kotlin? <ul><li>Statically typed </li></ul><ul><li>JVM-targeted </li></ul><ul><li>general-purpose programming lang...
Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and C...
Motivation <ul><li>Started in mid 2010 </li></ul><ul><li>Huge Java codebase (>50k classes, 10 years old) </li></ul><ul><li...
Design Goals <ul><li>Full  Java interoperability </li></ul><ul><li>Compiles  as   fast as  Java </li></ul><ul><li>More  co...
Tooling <ul><li>IntelliJ IDEA plugin developed in parallel with compiler </li></ul><ul><li>Both compiler and plugin will b...
Innovation <ul><li>Not a research project, don’t plan to publish papers </li></ul><ul><li>No ground-breaking language feat...
Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and C...
Features: Traditional <ul><li>Properties </li></ul><ul><li>First-class functions (closures) </li></ul><ul><li>Pattern matc...
Features: Distinguishing <ul><li>Traits (multiple inheritance of behavior) </li></ul><ul><li>Extension functions </li></ul...
Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and C...
Hello, world! <ul><li>namespace  hello  // optional semicolons </li></ul><ul><li>// namespace-level functions </li></ul><u...
Hello, <names>! <ul><li>fun  main(args : Array<String>) { </li></ul><ul><li>// type inference for local variables </li></u...
Hello, <names>!  (Faster version) <ul><li>fun  main(args : Array<String>) { </li></ul><ul><li>// ‘val’ means final </li></...
Hello, <names>!  (Realistic version) <ul><li>fun  main(args : Array<String>) { </li></ul><ul><li>val  names = args.join( &...
join() and forit() <ul><li>fun  <T> Iterable<T>.join(separator : String) : String { </li></ul><ul><li>val  names = StringB...
Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and C...
Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String...
Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String...
Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String...
Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String...
Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String...
Null-safety <ul><li>fun  parseInt(s : String) : Int? { </li></ul><ul><li>try  { </li></ul><ul><li>return  Integer.parseInt...
Implicit casts and When <ul><li>fun  foo(obj : Any?) { </li></ul><ul><li>if  (obj  is  String) { </li></ul><ul><li>obj .su...
More on when-expressions <ul><li>fun  bar(x : Int) { </li></ul><ul><li>when  (x) { </li></ul><ul><li>1 ,  2 ,  3  =>  &quo...
Classes <ul><li>open   class  Parent(p : Bar) { </li></ul><ul><li>open   fun  foo() {} </li></ul><ul><li>fun  bar() {} </l...
Traits <ul><li>trait  T1 : Class1, OtherTrait {  </li></ul><ul><ul><li>// No state </li></ul></ul><ul><ul><li>fun  foo() :...
Disambiguation <ul><li>trait  A { </li></ul><ul><ul><li>fun  foo() : Int = 1 </li></ul></ul><ul><li>} </li></ul><ul><li>op...
First-class Delegation <ul><li>trait  List<T> {  </li></ul><ul><ul><li>fun  add(t : T) </li></ul></ul><ul><ul><li>fun  get...
Class objects (I) <ul><li>Classes have no static members </li></ul><ul><li>Each class may have associated  class object : ...
Class objects (II) <ul><li>Class objects can have supertypes: </li></ul><ul><ul><ul><li>class  Example() { </li></ul></ul>...
Class objects (III) <ul><li>Generic constraints for class objects: </li></ul><ul><ul><ul><li>class  Lazy<T>()  </li></ul><...
Reified generics <ul><li>Type information is retained at runtime </li></ul><ul><ul><li>foo  is  List<T> </li></ul></ul><ul...
Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and C...
First-class functions <ul><li>Functions </li></ul><ul><ul><li>fun  f(p : Int) : String </li></ul></ul><ul><li>Function typ...
Higher-order functions <ul><li>fun   <T>   filter(   c : Iterable<T>,    f :  fun (T) : Boolean) : Iterable<T> </li></ul><...
Syntax sugar <ul><li>Last function literal argument </li></ul><ul><ul><li>filter(list)  {s =>  s.length < 3 } </li></ul></...
“ LINQ” style syntax <ul><li>users </li></ul><ul><li>.filter { it hasPrivilege WRITE } </li></ul><ul><li>.map { it => it.f...
Lock example (I) <ul><li>myLock.lock() </li></ul><ul><li>try  { </li></ul><ul><ul><li>// Do something </li></ul></ul><ul><...
Lock example (II) <ul><li>lock(myLock) { </li></ul><ul><ul><li>// Do something </li></ul></ul><ul><li>} </li></ul><ul><li>...
Lock example (III) <ul><li>inline   fun  lock(l : Lock, body :  fun  () : Unit) { </li></ul><ul><ul><li>l.lock() </li></ul...
Extension functions <ul><li>Functions </li></ul><ul><ul><li>fun  Foo.f(p : Int) : String </li></ul></ul><ul><li>Function t...
Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and C...
Builders in Groovy <ul><li>html {  </li></ul><ul><li>head {  </li></ul><ul><li>title  &quot;XML encoding with Groovy&quot;...
Builders in Kotlin <ul><li>html {  </li></ul><ul><li>head {  </li></ul><ul><li>title { + &quot;XML encoding with Kotlin&qu...
Builders: Implementation (I) <ul><li>Function definition fun  html(init :  fun  HTML.() : Unit) : HTML {    val  html = HT...
Builders: Implementation (II) <ul><li>Function definition fun  html(init :  fun  HTML.() : Unit) : HTML {    val  html = H...
Builders: Implementation (III) <ul><li>abstract   class  Tag( val   name  : String) : Element { </li></ul><ul><li>val   ch...
Builders in Kotlin <ul><li>html {  </li></ul><ul><li>head {  </li></ul><ul><li>title { + &quot;XML encoding with Kotlin&qu...
Resources <ul><li>Documentation:  http://jetbrains.com/kotlin </li></ul><ul><li>Blog:  http://blog.jetbrains.com/kotlin </...
Q&A Dmitry Jemerov [email_address]
Upcoming SlideShare
Loading in...5
×

The Kotlin Programming Language

2,123

Published on

Published in: Technology
1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total Views
2,123
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
13
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "The Kotlin Programming Language"

  1. 1. The Kotlin Programming Language <ul><li>Dmitry Jemerov </li></ul><ul><li>JetBrains GmbH </li></ul>
  2. 2. What is JetBrains?
  3. 3. What is Kotlin? <ul><li>Statically typed </li></ul><ul><li>JVM-targeted </li></ul><ul><li>general-purpose programming language </li></ul><ul><li>developed by JetBrains </li></ul><ul><ul><li>intended for industrial use </li></ul></ul><ul><li>Docs available today </li></ul><ul><li>Public beta in a few months </li></ul>
  4. 4. Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and Classes </li></ul><ul><li>Higher-order Functions </li></ul><ul><li>Type-safe Groovy-style Builders </li></ul>
  5. 5. Motivation <ul><li>Started in mid 2010 </li></ul><ul><li>Huge Java codebase (>50k classes, 10 years old) </li></ul><ul><li>Building tools for many nice languages </li></ul><ul><li>Want a modern, expressive language </li></ul><ul><li>… that’s easy to introduce in the existing environment </li></ul><ul><li>Need efficient tooling </li></ul><ul><li>None of the existing languages was a good fit </li></ul>
  6. 6. Design Goals <ul><li>Full Java interoperability </li></ul><ul><li>Compiles as fast as Java </li></ul><ul><li>More  concise  than  Java </li></ul><ul><li>Prevents more kinds of errors than  Java </li></ul><ul><li>Way  simpler  than  Scala </li></ul>
  7. 7. Tooling <ul><li>IntelliJ IDEA plugin developed in parallel with compiler </li></ul><ul><li>Both compiler and plugin will be released under Apache 2 license </li></ul><ul><li>Basic Eclipse plugin will be provided </li></ul>
  8. 8. Innovation <ul><li>Not a research project, don’t plan to publish papers </li></ul><ul><li>No ground-breaking language features </li></ul><ul><li>Focus on common sense and best practices established in other languages </li></ul><ul><ul><li>Groovy, Scala, C#, Gosu… </li></ul></ul><ul><li>Feature selection tradeoff: expressive yet easy to learn </li></ul>
  9. 9. Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and Classes </li></ul><ul><li>Higher-order Functions </li></ul><ul><li>Type-safe Groovy-style Builders </li></ul>
  10. 10. Features: Traditional <ul><li>Properties </li></ul><ul><li>First-class functions (closures) </li></ul><ul><li>Pattern matching </li></ul><ul><li>Operator overloading </li></ul><ul><li>Local type inference </li></ul>
  11. 11. Features: Distinguishing <ul><li>Traits (multiple inheritance of behavior) </li></ul><ul><li>Extension functions </li></ul><ul><li>Static null-safety guarantees </li></ul><ul><li>Implicit casts after type checks </li></ul><ul><li>Inline functions (zero-overhead closures) </li></ul><ul><li>Reified generics </li></ul><ul><li>First-class delegation </li></ul><ul><li>Build infrastructure (modules) as part of the language </li></ul>
  12. 12. Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and Classes </li></ul><ul><li>Higher-order Functions </li></ul><ul><li>Type-safe Groovy-style Builders </li></ul>
  13. 13. Hello, world! <ul><li>namespace hello // optional semicolons </li></ul><ul><li>// namespace-level functions </li></ul><ul><li>// types on the right </li></ul><ul><li>// no special syntax for arrays </li></ul><ul><li>fun main(args : Array<String>) : Unit { </li></ul><ul><li>println( &quot;Hello, world!&quot; ) </li></ul><ul><li>} </li></ul><ul><li>fun println(message : String) { </li></ul><ul><li>// System.out is a nullable field </li></ul><ul><li>System.out?.println(message) </li></ul><ul><li>} </li></ul>
  14. 14. Hello, <names>! <ul><li>fun main(args : Array<String>) { </li></ul><ul><li>// type inference for local variables </li></ul><ul><li>var names = &quot;&quot; </li></ul><ul><li>for (i in args.indices) { </li></ul><ul><li>names += args[i] </li></ul><ul><li>if (i + 1 < args.size) </li></ul><ul><li>names += &quot;, &quot; </li></ul><ul><li>} </li></ul><ul><li>println( &quot;Hello, $ names !&quot; ) // string templates </li></ul><ul><li>} </li></ul><ul><li>val Array<*>.indices : Iterable<Int> </li></ul><ul><li>get () = IntRange<Int>(0, size - 1) </li></ul>
  15. 15. Hello, <names>! (Faster version) <ul><li>fun main(args : Array<String>) { </li></ul><ul><li>// ‘val’ means final </li></ul><ul><li>val names = StringBuilder() // no ‘new’ </li></ul><ul><li>for (i in args.indices) { </li></ul><ul><li>names += args[i] </li></ul><ul><li>if (i + 1 < args.size) </li></ul><ul><li>names += &quot;, &quot; </li></ul><ul><li>} </li></ul><ul><li>println( &quot;Hello, $ names !&quot; ) </li></ul><ul><li>} </li></ul><ul><li>// operator overload as an extension function </li></ul><ul><li>fun StringBuilder.plusAssign(s : String) { </li></ul><ul><li>this .append(s) </li></ul><ul><li>} </li></ul>
  16. 16. Hello, <names>! (Realistic version) <ul><li>fun main(args : Array<String>) { </li></ul><ul><li>val names = args.join( &quot;, &quot; ) </li></ul><ul><li>println( &quot;Hello, $ names !&quot; ) </li></ul><ul><li>} </li></ul>
  17. 17. join() and forit() <ul><li>fun <T> Iterable<T>.join(separator : String) : String { </li></ul><ul><li>val names = StringBuilder() </li></ul><ul><li>forit ( this ) { </li></ul><ul><li>names += it .next() </li></ul><ul><li>if ( it .hasNext()) </li></ul><ul><li>names += separator </li></ul><ul><li>} </li></ul><ul><li>return names.toString() </li></ul><ul><li>} </li></ul><ul><li>fun <T> forit(col : Iterable<T>, f : fun (Iterator<T>) : Unit) { </li></ul><ul><li>val it = col.iterator() </li></ul><ul><li>while (it.hasNext()) { </li></ul><ul><li>f( it ) </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  18. 18. Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and Classes </li></ul><ul><li>Higher-order Functions </li></ul><ul><li>Type-safe Groovy-style Builders </li></ul>
  19. 19. Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Foo Foo Foo? Array<Foo> Foo[] Array<Foo?>? IntArray int [] IntArray? GEN LOAD
  20. 20. Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Foo Foo Foo? Array<Foo> Foo[] Array<Foo?>? IntArray int [] IntArray? GEN LOAD
  21. 21. Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Foo Foo Foo? Array<Foo> Foo[] Array<Foo?>? IntArray int [] IntArray? GEN LOAD
  22. 22. Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Foo Foo Foo? Array<Foo> Foo[] Array<Foo?>? IntArray int [] IntArray? GEN LOAD
  23. 23. Mapping to Java types Kotlin Java Kotlin Any Object Any? Unit void Unit Int int Int Int? Integer Int? String String String? Foo Foo Foo? Array<Foo> Foo[] Array<Foo?>? IntArray int [] IntArray? GEN LOAD
  24. 24. Null-safety <ul><li>fun parseInt(s : String) : Int? { </li></ul><ul><li>try { </li></ul><ul><li>return Integer.parseInt(s) </li></ul><ul><li>} catch (e : NumberFormatException) { </li></ul><ul><li>return null </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>fun main(args : Array<String>) { </li></ul><ul><li>val x = parseInt( &quot;123&quot; ) </li></ul><ul><li>val y = parseInt( &quot;Hello&quot; ) </li></ul><ul><li>print(x?.times( 2 )) // can’t say: print(x * 2) </li></ul><ul><li>if (x != null ) { </li></ul><ul><li>print(x * 2 ) // allowed after explicit check </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  25. 25. Implicit casts and When <ul><li>fun foo(obj : Any?) { </li></ul><ul><li>if (obj is String) { </li></ul><ul><li>obj .substring(2) </li></ul><ul><li>} </li></ul><ul><li>when (obj) { </li></ul><ul><li>is String => obj [ 0 ] </li></ul><ul><li>is Int => obj + 1 </li></ul><ul><li>!is Boolean => null </li></ul><ul><li>else => ... </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  26. 26. More on when-expressions <ul><li>fun bar(x : Int) { </li></ul><ul><li>when (x) { </li></ul><ul><li>1 , 2 , 3 => &quot;1, 2 or 3&quot; </li></ul><ul><li>-x => &quot;Zero&quot; </li></ul><ul><li>in 10 .. 100 => &quot;In range&quot; </li></ul><ul><li>!in 100 .. 1000 => &quot;Out of range&quot; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  27. 27. Classes <ul><li>open class Parent(p : Bar) { </li></ul><ul><li>open fun foo() {} </li></ul><ul><li>fun bar() {} </li></ul><ul><li>} </li></ul><ul><li>class Child(p : Bar) : Parent(p) { </li></ul><ul><li>override fun foo() {} </li></ul><ul><li>} </li></ul><ul><li>Primary constructor outside of class body </li></ul><ul><li>Constructors must initialize supertypes </li></ul><ul><li>Final by default, explicit open annotations </li></ul>
  28. 28. Traits <ul><li>trait T1 : Class1, OtherTrait { </li></ul><ul><ul><li>// No state </li></ul></ul><ul><ul><li>fun foo() : Int = 1 // open by default </li></ul></ul><ul><ul><li>fun bar() : Int // abstract by default </li></ul></ul><ul><li>} </li></ul><ul><li>class Foo(p : Bar) : Class1(p), T1, T2 { override fun bar() : Int = foo() + 1 </li></ul><ul><li>} </li></ul>
  29. 29. Disambiguation <ul><li>trait A { </li></ul><ul><ul><li>fun foo() : Int = 1 </li></ul></ul><ul><li>} </li></ul><ul><li>open class B() { </li></ul><ul><ul><li>open fun foo() : Int = 2 </li></ul></ul><ul><li>} </li></ul><ul><li>class C() : B(), A { </li></ul><ul><ul><li>override fun foo() = super <A>.foo() </li></ul></ul><ul><li>} </li></ul>
  30. 30. First-class Delegation <ul><li>trait List<T> { </li></ul><ul><ul><li>fun add(t : T) </li></ul></ul><ul><ul><li>fun get(index : Int) : T </li></ul></ul><ul><li>} </li></ul><ul><li>class ListDecorator<T>(p : List<T>) : List<T> by p { </li></ul><ul><li>override fun add(t : T) { </li></ul><ul><li>log.message( &quot;Added $ t &quot; ) </li></ul><ul><ul><ul><li>super .add(t) </li></ul></ul></ul><ul><li>} </li></ul><ul><ul><li>// override fun get(index : Int) : T = super.get() </li></ul></ul><ul><li>} </li></ul>
  31. 31. Class objects (I) <ul><li>Classes have no static members </li></ul><ul><li>Each class may have associated class object : </li></ul><ul><ul><ul><li>class Example() { </li></ul></ul></ul><ul><ul><ul><li>class object { </li></ul></ul></ul><ul><ul><ul><li>fun create() = Example() </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>val e = Example.create() </li></ul></ul></ul>
  32. 32. Class objects (II) <ul><li>Class objects can have supertypes: </li></ul><ul><ul><ul><li>class Example() { </li></ul></ul></ul><ul><ul><ul><li>class object : Factory<Example> { </li></ul></ul></ul><ul><ul><ul><li>override fun create() = Example() </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>val factory : Factory<Example> = Example </li></ul></ul></ul><ul><ul><ul><li>val e : Example = factory.create() </li></ul></ul></ul>
  33. 33. Class objects (III) <ul><li>Generic constraints for class objects: </li></ul><ul><ul><ul><li>class Lazy<T>() </li></ul></ul></ul><ul><ul><ul><li>where class object T : Factory<T> </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><li>private var store : T? = null </li></ul></ul></ul><ul><ul><ul><li>public val value : T </li></ul></ul></ul><ul><ul><ul><li>get () { </li></ul></ul></ul><ul><ul><ul><li>if (store == null ) { </li></ul></ul></ul><ul><ul><ul><li>store = T.create() </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>return store </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>
  34. 34. Reified generics <ul><li>Type information is retained at runtime </li></ul><ul><ul><li>foo is List<T> </li></ul></ul><ul><ul><li>Array<T>(3) </li></ul></ul><ul><ul><li>T.create() </li></ul></ul><ul><li>Java types are still erased </li></ul><ul><ul><li>foo is java.util.List<*> </li></ul></ul>
  35. 35. Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and Classes </li></ul><ul><li>Higher-order Functions </li></ul><ul><li>Type-safe Groovy-style Builders </li></ul>
  36. 36. First-class functions <ul><li>Functions </li></ul><ul><ul><li>fun f(p : Int) : String </li></ul></ul><ul><li>Function types </li></ul><ul><ul><li>fun (p : Int) : String </li></ul></ul><ul><ul><li>fun (Int) : String </li></ul></ul><ul><li>Function literals </li></ul><ul><ul><li>{p => p.toString() } </li></ul></ul><ul><ul><li>{(p : Int) => p.toString() } </li></ul></ul><ul><ul><li>{(p : Int) : String => p.toString() } </li></ul></ul>
  37. 37. Higher-order functions <ul><li>fun <T> filter( c : Iterable<T>, f : fun (T) : Boolean) : Iterable<T> </li></ul><ul><li>filter(list, {s => s.length < 3}) </li></ul>
  38. 38. Syntax sugar <ul><li>Last function literal argument </li></ul><ul><ul><li>filter(list) {s => s.length < 3 } </li></ul></ul><ul><li>One-parameter function literal </li></ul><ul><ul><li>filter(list) { it .length < 3 } </li></ul></ul><ul><li>Infix calls </li></ul><ul><ul><li>a contains b // same as a.contains(b) </li></ul></ul>
  39. 39. “ LINQ” style syntax <ul><li>users </li></ul><ul><li>.filter { it hasPrivilege WRITE } </li></ul><ul><li>.map { it => it.fullName } </li></ul><ul><li>.orderBy { lastName } </li></ul>
  40. 40. Lock example (I) <ul><li>myLock.lock() </li></ul><ul><li>try { </li></ul><ul><ul><li>// Do something </li></ul></ul><ul><li>} </li></ul><ul><li>finally { </li></ul><ul><ul><li>myLock.unlock() </li></ul></ul><ul><li>} </li></ul>
  41. 41. Lock example (II) <ul><li>lock(myLock) { </li></ul><ul><ul><li>// Do something </li></ul></ul><ul><li>} </li></ul><ul><li>fun lock(l : Lock, body : fun () : Unit) </li></ul>
  42. 42. Lock example (III) <ul><li>inline fun lock(l : Lock, body : fun () : Unit) { </li></ul><ul><ul><li>l.lock() </li></ul></ul><ul><ul><li>try { </li></ul></ul><ul><ul><ul><li>body() </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>finally { </li></ul></ul><ul><ul><ul><li>l.unlock() </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  43. 43. Extension functions <ul><li>Functions </li></ul><ul><ul><li>fun Foo.f(p : Int) : String </li></ul></ul><ul><li>Function types </li></ul><ul><ul><li>fun Foo.(p : Int) : String </li></ul></ul><ul><ul><li>fun Foo.(Int) : String </li></ul></ul><ul><li>Function literals </li></ul><ul><ul><li>{Foo.(p : Int) => this .toString() } </li></ul></ul><ul><ul><li>{Foo.(p : Int) : String => this .toString() } </li></ul></ul><ul><ul><li>{Foo.(p : Int) : String => toString() } </li></ul></ul>
  44. 44. Outline <ul><li>Motivation </li></ul><ul><li>Feature Overview </li></ul><ul><li>Basic Syntax </li></ul><ul><li>Types and Classes </li></ul><ul><li>Higher-order Functions </li></ul><ul><li>Type-safe Groovy-style Builders </li></ul>
  45. 45. Builders in Groovy <ul><li>html { </li></ul><ul><li>head { </li></ul><ul><li>title &quot;XML encoding with Groovy&quot; </li></ul><ul><li>} </li></ul><ul><li>body { </li></ul><ul><li>h1 &quot;XML encoding with Groovy&quot; </li></ul><ul><li>p &quot;this format can be used as an alternative to XML&quot; </li></ul><ul><li>/* an element with attributes and text content */ </li></ul><ul><li>ahref: 'http://groovy.codehaus.org' [ &quot;Groovy&quot; ] </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  46. 46. Builders in Kotlin <ul><li>html { </li></ul><ul><li>head { </li></ul><ul><li>title { + &quot;XML encoding with Kotlin&quot; } </li></ul><ul><li>} </li></ul><ul><li>body { </li></ul><ul><li>h1 { + &quot;XML encoding with Kotlin&quot; } </li></ul><ul><li>p { + &quot;this format is now type-safe &quot; } </li></ul><ul><li>/* an element with attributes and text content */ </li></ul><ul><li>a(href= &quot;http://jetbrains.com/kotlin&quot; ) { + &quot;Kotlin&quot; } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  47. 47. Builders: Implementation (I) <ul><li>Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html. init() return html } </li></ul><ul><li>Usage html { this .head { ... } } </li></ul>
  48. 48. Builders: Implementation (II) <ul><li>Function definition fun html(init : fun HTML.() : Unit) : HTML { val html = HTML() html. init() return html } </li></ul><ul><li>Usage html { head { ... } } </li></ul>
  49. 49. Builders: Implementation (III) <ul><li>abstract class Tag( val name : String) : Element { </li></ul><ul><li>val children = ArrayList<Element>() </li></ul><ul><li>val attributes = HashMap<String, String>() </li></ul><ul><li>} </li></ul><ul><li>abstract class TagWithText(name : String) : Tag(name) { </li></ul><ul><li>fun String.plus() { </li></ul><ul><li>children.add(TextElement( this )) </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>class HTML() : Tag( &quot;html&quot; ) { </li></ul><ul><li>fun head(init : fun Head.() : Unit) { } </li></ul><ul><li>fun body(init : fun Body.() : Unit) { } </li></ul><ul><li>} </li></ul>
  50. 50. Builders in Kotlin <ul><li>html { </li></ul><ul><li>head { </li></ul><ul><li>title { + &quot;XML encoding with Kotlin&quot; } </li></ul><ul><li>} </li></ul><ul><li>body { </li></ul><ul><li>h1 { + &quot;XML encoding with Kotlin&quot; } </li></ul><ul><li>p { + &quot;this format is now type-safe &quot; } </li></ul><ul><li>/* an element with attributes and text content */ </li></ul><ul><li>a(href= &quot;http://jetbrains.com/kotlin&quot; ) { + &quot;Kotlin&quot; } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  51. 51. Resources <ul><li>Documentation: http://jetbrains.com/kotlin </li></ul><ul><li>Blog: http://blog.jetbrains.com/kotlin </li></ul><ul><li>Issue tracker: http://youtrack.jetbrains.net/issues/KT </li></ul><ul><li>Twitter: </li></ul><ul><ul><li>@project_kotlin </li></ul></ul><ul><ul><li>@intelliyole </li></ul></ul>
  52. 52. Q&A Dmitry Jemerov [email_address]
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×