from python to scala
TRANSCRIPT
ffunctioninc.
From Pythonto Scala
Sébastien Pierre, ffunction inc.@Montréal Python, April 2010
www.ffctn.com
ffunctioninc.
Stuff I love about Python
● Expressive (and compact)● Simple to learn● Lots of smartly designed libraries
ffunctioninc.
Stuff that I miss in Python
● Closures (with syntax)● Easy concurrency (model and syntax)● … a compiler !!
ffunctioninc.
Scala - overview
ffunctioninc.
The language
● JVM-based, compiled + « interpreted »● Functional + OO (post-functional)
● ~6 years old● used by Twitter, FourSquare
ffunctioninc.
The library
● Anything in Java● Immutable types library (safe for concurrent apps)
● Concurrency + actor model● Quality community-contributed libraries
ffunctioninc.
The feel
● Make do with braces● map/filter/apply (and fold)
● ~25% more lines than with Python● Very good DSL-ability● Fast !
ffunctioninc.
Scala – basics
ffunctioninc.
Rich types
Scala Python
Array Array(1,2,3,4) (1,2,3,4]
Tuple (1,2,3,4) (1,2,3,4)
List List(1,2,3,4) (1,2,3,4)
Map Map(“a”>1, “b”>2) {“a”:1, “c”:2}
Set Set(1,2,3,4) set(1,2,3,4)
ffunctioninc.
Closures
[1,2,3] map { i => i + 1 }
{i:Int => i + 1 } # 1-param normal
(i:Int) => { i + 1 } # n-param normal
[1,2,3] map { _ + 1 } # implicit args
val f = { i:Int => i + 1}
ffunctioninc.
Classes + traits
class A{ … }
ffunctioninc.
Classes + traits
class A{ … }
class Bextends A
{ … }
ffunctioninc.
Classes + traits
class A{ … }
class Bextends A
with T{ … }
trait T{ … }
ffunctioninc.
Classes + traits
class A{ … }
class Bextends A
with T{ … }
trait Textends U
{ … }
trait U{ … }
ffunctioninc.
Classes + traits
class A{ … }
trait Textends U
{ … }
trait U{ … }
class Bextends A
with T{ … }
ffunctioninc.
Batteries included
scala.xml.XML.load("http://ffunction.posterous.com/rss.xml"
) \\ "item" \ "title" toList
List[scala.xml.Node] = List(<title xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:atom="http://www.w3.org/2005/Atom">Notes on creating a multitouch interface</title>, <title xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:atom="http://www.w3.org/2005/Atom">Formations en interface & visualisation</title>, <title xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:posterous="http://posterous.com/help/rss/1.0" xmlns:atom="http://www.w3.org/2005/Atom">Hello, world !</title>)
ffunctioninc.
Interpreter
scala> println( List("Hello","world !") match { case head :: tail => tail.foldLeft(head)( (a:String,b:String)=>{a+", " +b})})
Hello, world !
ffunctioninc.
Scala – the sublime*
*SUBLIME : pleasure + pain, according to the Romantics
ffunctioninc.
The almost ML-grade type system
val f:List[Int] = List[1,2,3]
val m:Map[String,List[Int]] = Map(“a” [1,2,3],→“b” [4,5,6]→
)
type JSONable = { def toJSON():String }
> ensure constraints at compile-type, speed up programs
ffunctioninc.
Multiple method dispatch
def merge(
a:List[Object],b:List[Object]
):List[Object]
def merge(
a:Map[String,Object],b:Map[String,Object]
):Map[String,Object]
> makes it easy to specialize (existing) libraries
ffunctioninc.
Pattern-matching
val sum = {_ match {
case head :: tail >head + sum (tail)
case Nil >0
}}
> amazing for message-based communication and list manipulation
ffunctioninc.
Actors
import scala.actors.Actor._
actor { while (true) {println ("Hello from A") ; Thread.sleep(1)}}actor { while (true) {println ("Hello from B") ; Thread.sleep(1)}}Hello from AHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from A
Hello from AHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from A
Hello from AHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from A
Hello from AHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from A
Hello from AHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from A
Hello from AHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from AHello from BHello from A
ffunctioninc.
Message-passing
import scala.actors.Actor._val repeater = actor { while (true) { receive { case msg:String => println(this + ">" + msg) ; reply (msg)}}}actor { repeater ! "ping" while (true) { receive { case msg:String =>
println(this + ">" + msg) ; reply (msg)}}}
ffunctioninc.
Le mot de la fin
ffunctioninc.
Scala is cool !
● Very powerful● Hard to learn, long time to master● Amazing complement to Python for research &
performance-critical and scalable projects● Easy to interface with Python !