Scala 2.10.0

Download Scala 2.10.0

Post on 06-Dec-2014

1.186 views

Category:

Technology

1 download

Embed Size (px)

DESCRIPTION

Scala 2.10.0 -- de onde viemos, e para onde vamos? Breve olhar nas funcionalidades a serem introduzidas por Scala 2.10.0. Nota: Scala 2.10.0 no foi lanada, e a verso final ter diferenas em relao ao apresentado.

TRANSCRIPT

<ul><li> 1. De onde viemos e para onde vamos? Daniel Cap Sobral</li></ul><p> 2. Quem sou eu? Daniel C. Sobral @ Stack Overflow dcsobral @ Twitter, Gmail/Gtalk, Skype, SliderShare Daniel Sobral @ Facebook, Speakers Deck, LinkedIn http://www.linkedin.com/in/danielsobral http://www.slideshare.net/dcsobral https://speakerdeck.com/u/dcsobral http://dcsobral.blogspot.com 3. O que eu sei de Scala? Scala gold badge @ Stack Overflow Pequenas contribuies para Scala: otimizaes funcionalidades bug fixes documentao (nem to pequenas) Participante ativo da comunidade Scala (listas dediscusso, irc) Blog 4. IMPORTANTE! Scala 2.10.0 ainda no foi lanada! Na data em que esta apresentao foi escrita... (07/07/2012) As informaes contidas nessa apresentao podemmudar antes do lanamento. 5. Sumrio Histrico Futuro Imediato Versionamento Processo de Release Bug fixes Melhorias SIPs (Scala Improvement Process) Reflection Atores e Akka Futuro Distante 6. Histrico2003 2004 2005 2006 2007 2008 2009 2010 20112012 0.8.1 1.0.0 1.4.0 2.0.0 2.3.2 2.7.1 2.7.3 2.8.0 2.9.0 2.9.2 0.8.2 1.1.0 2.1.0 2.3.3 2.7.2 2.7.4 2.8.1 2.9.1 0.9.0 1.1.0 2.1.1 2.4.0 2.7.5 2.8.2 0.9.1 1.1.1 2.1.2 2.5.0 2.7.6 1.2.0 2.1.3 2.5.1 2.7.7 1.3.0 2.1.5 2.6.0 2.1.6 2.6.1 2.1.7 2.1.8 2.2.0 2.3.0 2.3.1 7. Alguns marcos importantes 2011 Parallel Collections 2010 Novo design de Collections Compatibilidade Binria 2008 Java Generics Case Class Extractors2007 Extractors Private/protectedprimary constructors Private[this] Placeholder 2006 parameters Scalac escrito em Early Initialization Scala Abstract Type ImplicitsConstructors Traits e Existential Types linearizao Lazy values Multilline Strings Structural Types 8. Explicando Versionamento2 .9.1 -1 Bug Epoch Major Minor fix 9. Versionamento Scala 2.10.0 Major release Binariamente incompatvel Mudanas de linguagem Mudanas de biblioteca Novas depreciaes Remoo de caractersticas depreciadas (deprecated) Classes Mtodos Caractersticas da linguagem 10. Exemplos de Novas Depreciaes Nmeros octais!scala&gt; 077:1: warning: Treating numbers with a leading zero as octal isdeprecated. 077 ^res10: Int = 63 Double terminando em pontoscala&gt; 1.:1: warning: This lexical syntax is deprecated. From scala2.11, a dot willonly be considered part of a number if it is immediately followed bya digit. 1. ^res11: Double = 1.0 11. Exemplos de DepreciaesRemovidas Caractersticas de linguagem for ( val i new FileInputStream(b) } recover { case _: FileNotFoundException =&gt; defaultInputStream } andThen { stream =&gt; in = stream.read(); Stream.close(); in } 22. scala.util.hashing.Hashing def hashingOf[T : Hashing](obj: T): Int = implicitly[Hashing[T]].hash(obj) // Uma funo de hashing ruim para Seqs implicit val seqHashing = Hashing fromFunction ((_: Seq[_]).size) 23. IsTraversableOnceIsTraversableLike class FilterMapImpl[A, Repr] (val r: GenTraversableLike[A, Repr]) { final def filterMap[B, That] (f: A =&gt; Option[B]) (implicit cbf: CanBuildFrom[Repr, B, That]) : That = r.flatMap(f(_).toSeq) } // Como escrever a converso implcita??? 24. IsTraversableOnceIsTraversableLike Problemas em se escrever a converso: Array e String no so GenTraversable String no possui parmetro de elemento (A) Nem BitSet e outras colees Inferncia sobre view bounds deficiente 25. IsTraversableOnceIsTraversableLike class FilterMapImpl[A, Repr] (val r: GenTraversableLike[A, Repr]) { final def filterMap[B, That] (f: A =&gt; Option[B]) (implicit cbf: CanBuildFrom[Repr, B, That]) : That = r.flatMap(f(_).toSeq) } implicit def filterMap[Repr, A](r: Repr)(implicit fr: IsTraversableOnce[Repr]): FilterMapImpl[fr.A,Repr] = new FilterMapImpl(fr.conversion(r)) 26. Pools Configurveis em ColeesParalelasimport scala.collection.parallel._val pc = mutable.ParArray(1, 2, 3)pc.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.ForkJoinPool(2))pc map { _ + 1)pc.tasksupport = new ThreadPoolTaskSupport() 27. Pools Configurveis em ColeesParalelas Customizandoclass customTaskSupport extends TaskSupport {def execute[R, Tp](task: Task[R, Tp]): () =&gt; R = ???def executeAndWaitResult[R, Tp](task: Task[R, Tp]): R = ???def parallelismLevel: Int = ???} 28. to[Collection]scala&gt; List(2, 1, 3).to[Seq]res17: Seq[Int] = Vector(2, 1, 3)scala&gt; List(2, 1, 3).to[Vector]res18: Vector[Int] = Vector(2, 1, 3)scala&gt; List(2, 1, 3).to[collection.mutable.Seq]res19: scala.collection.mutable.Seq[Int] =ArrayBuffer(2, 1, 3)scala&gt; List(2, 1, 3).to[collection.immutable.SortedSet]res20: scala.collection.immutable.SortedSet[Int] =TreeSet(1, 2, 3) 29. ??? ??? um mtodo do tipo Nothing que lana umaexceo Por ser do tipo Nothing, ??? pode aparecer no lugarde qualquer expresso Excelente para stubs, exerccios e apresentaes! 30. ???trait Opt [A] { // Exercise by Tony Morrisdef fold[X](some: A =&gt; X, none: =&gt; X): X = ???def map[B](f: A =&gt; B): Opt[B] = ???def get: A = ???def flatMap[B](f: A =&gt; Opt[B]): Opt[B] = ???def mapAgain[B](f: A =&gt; B): Opt[B] = ???def getOrElse(e: =&gt; A): A = ???def filter(p: A =&gt; Boolean): Optional[A] = ???def exists(p: A =&gt; Boolean): Boolean = ???def forall(p: A =&gt; Boolean): Boolean = ???def foreach(f: A =&gt; Unit): Unit = ???def isDefined: Boolean = ???def orElse(o: =&gt; Opt[A]): Opt[A] = ???// etc Adaptado de Tony Morris, http://blog.tmorris.net/further-understanding-scalaoption/ 31. ???trait Opt [A] { // Exercise by Tony Morrisdef fold[X](some: A =&gt; X, none: =&gt; X): X = ???def map[B](f: A =&gt; B): Opt[B] = ???def get: A = ???def flatMap[B](f: A =&gt; Opt[B]): Opt[B] = ???def mapAgain[B](f: A =&gt; B): Opt[B] = ???def getOrElse(e: =&gt; A): A = ???def filter(p: A =&gt; Boolean): Optional[A] = ???def exists(p: A =&gt; Boolean): Boolean = ???def forall(p: A =&gt; Boolean): Boolean = ???def foreach(f: A =&gt; Unit): Unit = ???def isDefined: Boolean = ???def orElse(o: =&gt; Opt[A]): Opt[A] = ???// etc Adaptado de Tony Morris, http://blog.tmorris.net/further-understanding-scalaoption/ 32. Melhorias Scaladoc Implicits! Diagramas! API docs 33. ScalaDoc &amp; Implicits 34. Parallel Collections Docs! 35. Diagramas de Classe! 36. Parmetros para ScalaDoc -implicits -diagrams Esse slide foi exigncia de Vlad Ureche ;-) 37. SIP Scala Improvement Process SIP-11: String Interpolation SIP-12: Sintaxe das Estruturas de Controle SIP-13: Classes Implicitas SIP-14: Futures e Promises SIP-15: Value Classes SIP-16: Macros auto-limpantes SIP-17: Tipo Dynamic SIP-18: Modularizao de funcionalidades dalinguagem SIP-19: Posio de Cdigo Fonte Implcitas 38. SIP Scala Improvement Process SIP-11: String Interpolation (aceita!) SIP-12: Sintaxe das Estruturas de Controle (adiada) SIP-13: Classes Implicitas (aceita!) SIP-14: Futures e Promises (aceita!) SIP-15: Value Classes (aceita!) SIP-16: Macros auto-limpantes (adiada) SIP-17: Tipo Dynamic (aceita!) SIP-18: Modularizao de funcionalidades dalinguagem (aceita!) SIP-19: Posio de Cdigo Fonte Implcitas (recusada) 39. SIP-11: String Interpolation Ausncia de interpolao de strings motivo de constantereclamaes Mas bem poucas linguagens suportam! Odersky diz que diferena entre ${x} e "+x+" de umnico caracter Mas ignora os shifts... Alegao de que " e + no teclado Suco no precisa de shift Verdade! Reviravolta: E se interpolao de strings for mais do que interpolao de strings? 40. SIP-11: String Interpolationdef hello(name: String = "world"): String ="Hello, " + name + "! "// Interpolation!def hello(name: String = "world"): String =s"Hello, $name! " 41. SIP-11: String Interpolationdef percentCompleted(total: Int, done: Int): String =Try ( done * 100 / total ) map {percent =&gt; f"$percent%2d% completed"} getOrElse "100% completed"def percentCompleted(total: Int, done: Int): String =Try (f"${ done * 100 / total }%2d% completed") getOrElse "100% completed" 42. SIP-11: String Interpolation:Como funciona?s"Hello, $name!" // traduzido paraStringContext("Hello, ", "!").s(name)f"${ done * 100 / total }%2d% completed" // traduzido paraStringContext("", "%2d% completed").f(done * 100 / total) 43. SIP-11: String Interpolation Literais multi-linha tambm so aceitos s"""Ok!""" Interpolao pode ser aninhada s"${ s"$x" }" Contra-barra no interpretada r"d+/$mes" // interpolador r no existe! StringContext("""d+/""").r(mes) Mas s e f interpretam as barras! s"Hello, $name!n" // newline normal Formas de alterar comportamento: Adio de mtodos implcitos StringContext Sobreposio de objeto ou mtodo chamado StringContext r no precisa ser mtodo! 44. SIP-11: String Interpolation// Adio de interpolao via implicitclass RegexContext(sc: StringContext) {def r(args: Any*) = {sc.checkLengths(args: _*)val res = (args, sc.parts.tail).zipped map {(arg, part) =&gt; s"Q$argE$part"} mkString ""(sc.parts.head + res).r}}implicit def toRC(sc: StringContext) = new RegexContext(sc) 45. SIP-11: String Interpolation// Aninhamento de interpoladoresclass RegexContext(sc: StringContext) {def r(args: Any*) = {sc.checkLengths(args: _*)s"${sc.parts.head}${(args, sc.parts.tail).zipped map { (arg, part) =&gt; s"Q$argE$part"} mkString ""}".r}}implicit def toRC(sc: StringContext) = new RegexContext(sc) 46. SIP-11: String Interpolation// Adio de interpolao via sobreposioobject StringContext(parts: String*) {def r(args: Any*) = {require(parts.length == args.length + 1)val res = (args, parts.tail).zipped map {"Q" + _ + "E" + _} mkString ""(parts.head + res).r }}// Possvel alterar s e f! 47. SIP-11: String Interpolation// apply e unapplySeqdef hello(name: String = "world"): String = i"Hello, $name!"def who(message: String): String = message match {case i"Hello, $name!" =&gt; namecase _=&gt; no clue"}who(hello("Daniel")) == "Daniel" 48. SIP-11: String Interpolation// apply e unapplySeqimplicit class SI(sc: StringContext) {object i {def apply(args: Any*): String =sc.parts.head +(args,sc.parts.tail).zipped.map(_+_).mkStringdef unapplySeq(s: String): Option[Seq[String]] = {val partsr = sc.parts map (p =&gt; s"Q$pE")val r = (partsr mkString "(.*)").rs match { case r(xs @ _*) =&gt; Some(xs) case _ =&gt; None }}}} 49. SIP-13: Classes Implcitas Enrich My Library (antigo Pimp My Library)extremamente popular Mas cerimonioso... Extension methods se tornando comuns em outraslinguagens E com menos cerimnia! Soluo: implicit class 50. SIP-13: Classes Implcitas// Adio de interpolao via implicit classimplicit class RegexContext(sc: StringContext) {def r(args: Any*) = {sc.checkLengths(args: _*)val res = (args, sc.parts.tail).zipped map {"Q" + _ + "E" + _} mkString ""(sc.parts.head + res).r}} 51. SIP-14: Futures and Promises Executar operaes em paralelo, de forma no-bloqueante uma necessidade comum Evidncia: diversas bibliotecas contm implementaes deFuture Incluindo a biblioteca padro de atores! Problema: Interface no-padronizada Dependncia de implementao Soluo: API poderosa e flexvel implementando os conceitos de Future e Promise 52. SIP-14: Futures and Promises// TODO Desculpem! Exemplos da SIP:import scala.concurrent._val f: Future[List[String]] = future {session.getRecentPosts}f onComplete {case Right(posts) =&gt; for (post render("An error has occured: " +t.getMessage)} 53. SIP-14: Futures and Promises// TODO Desculpem! Exemplos da SIP:import scala.concurrent._val f: Future[List[String]] = future {session.getRecentPosts}f onFailure {case t =&gt; render("An error has occured: " + t.getMessage)} onSuccess {case posts =&gt; for (post if (isProfitable(quote)) connection.buy(amount,quote) else throw new Exception("not profitable")}blocking(purchase, 0 ns)} 55. SIP-14: Futures and Promises// TODO Desculpem! Exemplos da SIP:import scala.concurrent.{ future, promise }val p = promise[T]val f = p.futureval producer = future {val r = produceSomething()p success rcontinueDoingSomethingUnrelated()}val consumer = future {startDoingSomething()f onSuccess {case r =&gt; doSomethingWithResult()}} 56. SIP-15: Value Classes A maldio das referncias A maldio do boxing: case class Meter(n: Int) muito mais caro que int A maldio do das classes implcitas: "abc.r cria um objeto desnecessrio s para chamar new Regex("abc") Queremos uma classe que no seja referncia! Soluo: value classes. 57. SIP-15: Value Classes// Adio de interpolao via implicit value classimplicit class RegexContext(sc: StringContext) extends AnyVal {def r(args: Any*) = {sc.checkLengths(args: _*)val res = (args, sc.parts.tail).zipped map {"Q" + _ + "E" + _} mkString ""(sc.parts.head + res).r}} 58. SIP-15: Value Classes S podem ter um parmetro O parmetro deve ser um val Ou seja, [T: Ordering](v: T) no aceito Pode ser estendidas por traits Se os mesmos estenderem Any ou AnyVal No podem definir igualdade ou hash code Podem ser case classes! Igualdade e hash code so aplicadas sobre o parmetro So efetivamente final Em um escopo local, so removidas por otimizao Se escapam do escopo, so boxed 59. SIP-16: Macros Compiladores grandes so de difcil manuteno Presso contra adio de funcionalidades Plugins do compilador resolvem... ...mas so difceis de manter em sincronia Possvel soluo: Macros Macros? Ugh! trauma do C/C++! Novidade: scala.reflection Macros saem quase de graa! 60. SIP-16: Macros Scala CATs! Compile-time AST Transformations Abstract Syntax Tree Inspirado pelas macros de Nemerle Quatro tipos cogitados: Typed macros Somente este tipo est disponvel! Untyped macros Type (class/trait) macros Annotation macros 61. SIP-16: Macros// Typed macros(1 to 5).foreach(println) ^ ^ | + Verificao de tipos + Macro executada + Nova verificao de tipos 62. SIP-16: Macros// Untyped macrosfor {val i = 0; i &lt; 10; i += 1} println(i)^ ^| || + Tipo dos argumentos no checado!+ Macro executada+ Verificao de tipos 63. SIP-16: Macros// Untyped macros porque?for {val i = 0; i &lt; 10; i += 1} println(i)^ ^|i no existe neste escopo! ++ i s existe neste escopo. 64. SIP-16: Macros// Type (class/trait) macrosclass User extends DbTable(jdbcUrl, t_user) ^ + Macro// Banco de dados consultado durante// compilao para gerao do corpo da// classe User 65. SIP-16: Macros Type macros so similares aos type providers de F# S que mais. ;-) Verso experimental de SLICK (ex-ScalaQuery)implementada com verso experimental de typemacros 66. SIP-16: Macros// Macro annotations@memoizedef fat(n: Int) =if (n &gt; 0) n * fat(n 1)else 1// Macro aplicada ao elemento anotado,// seja ele classe, mtodo, parmetro, etc 67. SIP-16: Macros Somente typed macros disponibilizadas... Experimentalmente... Atrs do flag language:experimental.macros... Mas vrias partes da biblioteca padro j as estousando! Por outro lado, tornar macros fceis no foi um dosobjetivos... De propsito... Trauma das macros do C/C++ muito difuso... ...mas as verdadeiras macros do C++ so os templates! 68. SIP-16: Macros Vantagens de Typed Macros: Relativamente simples de implementar Assinatura de mtodo implementado com macro no tem nenhuma diferena! Facilidade para testar Higiene provida atravs de macro! Macros no higinicas fceis de criar 69. SIP-16: Macros Desvantagens: Limites no que possvel Compilao em dois estgios No possvel compilar uma ma...</p>