Scala 2 + 2 > 4
Upcoming SlideShare
Loading in...5
×
 

Scala 2 + 2 > 4

on

  • 3,427 views

 

Statistics

Views

Total Views
3,427
Views on SlideShare
3,351
Embed Views
76

Actions

Likes
0
Downloads
37
Comments
0

3 Embeds 76

http://bolddream.com 69
http://www.linkedin.com 5
https://www.linkedin.com 2

Accessibility

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Scala 2 + 2 > 4 Scala 2 + 2 > 4 Presentation Transcript

  • Hello world
  • object HelloWorld { def main ( args : Array [ String ]) { println ( "Hello world!" ) } } public class HelloWorld { public static void main ( String [] args ) { System . out . println ( "Hello world" ); } }
  • Малък мащаб
  • scala> var peaks = Map( | "Musala" -> 2925, | "Rozhen" -> 1750 | ) peaks: scala.collection.immutable.Map[java.lang.String,Int] = Map(Musala -> 2925, Rozhen -> 1750) scala> peaks += "Botev" -> 2376 scala> println(peaks) Map(Musala -> 2925, Rozhen -> 1750, Botev -> 2376)
  • На високо ниво
  • Java public boolean hasUpperCase ( String text ) { boolean hasUpperCase = false ; for ( int i = 0; i < text . length (); i ++) { if ( Character . isUpperCase ( text . charAt ( i ))) { hasUpperCase = true ; break ; } } return hasUpperCase ; }
  • Scala def hasUpperCase ( text : String ) = text . exists ( _ . isUpperCase )
  • Експресивен
  • Java public BigInteger ????? ( BigInteger x ) { if ( x == BigInteger . ZERO ) { return BigInteger . ONE ; } return x . multiply ( ?????( x . subtract ( BigInteger . ONE ))); }
  • Java public BigInteger factorial ( BigInteger x ) { if ( x == BigInteger . ZERO ) { return BigInteger . ONE ; } return x . multiply ( factorial ( x . subtract ( BigInteger . ONE ))); }
  • def factorial ( x : BigInt ) = if ( x == 0) 1 else x * factorial ( x - 1) Scala
  • Java public class Person { private String name ; private int age ; public Person ( String name , int age ) { this . name = name ; this . age = age ; } public String getName () { return name ; } public int getAge () { return age ; } public void setName ( String name ) { this . name = name ; } public void setAge ( int age ) { this . age = age ; } }
  • class Person ( var name : String , var age : int ) Scala
  • Turtles all the way down http://en.wikipedia.org/wiki/Turtles_all_the_way_down
  • 1 + 2 1.+(2) 1 to 8 // => Range.Inclusive(1, 8) 1.to(8)
  • Прагматичен
  • def users = < users > < user role = &quot;customer&quot; > < name >{ user . name }</ name > < password >{ user . password }</ password > < email >{ user . email }</ email > </ user > <user role= &quot;boss&quot; > < name >{ boss . name }</ name > < password >{ boss . password }</ password > < email >{ boss . email }</ email > </ user > </ users > users &quot;user&quot;
  • DSLs Growing a language http://video.google.com/videoplay?docid=-8860158196198824415
  • Scala specs object HelloSpec extends Specification { &quot;'hello world' has 11 characters&quot; in { &quot;hello world&quot; size must_== 11 } &quot;'hello world' matches 'h.* w.*'&quot; in { &quot;hello world&quot; must be matching ( &quot;h.* w.*&quot; ) } }
  • object Basic extends Baysick { def main ( args : Array [ String ]) = { 10 PRINT &quot;Welcome to Baysick Lunar Lander v0.9&quot; 20 LET ( 'dist := 100) 30 LET ( 'v := 1) 40 LET ( 'fuel := 1000) 50 LET ( 'mass := 1000) 60 PRINT &quot;You are drifting towards the moon.&quot; 70 PRINT &quot;You must decide how much fuel to burn.&quot; 80 PRINT &quot;To accelerate enter a positive number&quot; 90 PRINT &quot;To decelerate a negative&quot; 100 PRINT &quot;Distance &quot; % 'dist % &quot;km, &quot; % &quot;Velocity &quot; % 'v % &quot;km/s, &quot; % &quot;Fuel &quot; % 'fuel 110 INPUT 'burn 120 IF ABS ( 'burn ) <= 'fuel THEN 150 130 PRINT &quot;You don't have that much fuel&quot; 140 GOTO 100 150 LET ( 'v := 'v + 'burn * 10 / ( 'fuel + 'mass )) 160 LET ( 'fuel := 'fuel - ABS ( 'burn )) 170 LET ( 'dist := 'dist – 'v ) 180 IF 'dist > 0 THEN 100 190 PRINT &quot;You have hit the surface&quot; 200 IF 'v < 3 THEN 240 210 PRINT &quot;Hit surface too fast (&quot; % 'v % &quot;)km/s&quot; 220 PRINT &quot;You Crashed!&quot; 230 GOTO 250 240 PRINT &quot;Well done&quot; 250 END RUN } } http://www.scala-lang.org/node/1403
  • val worldSaver = actor { loop { react { case SaveTheWorld ( when ) => saveTheWorldAfter ( when ) case BeBad => // Ignore it - we are good! } } } worldSaver ! SaveTheWorld ( new Date )
  • Ф(у,н,к,ц,и,о,н,а,л,е,н) език
  • Защо cat File | grep println | wc
  • Функции ( x : Int , y : Int ) => if ( x > y ) x else y val max = ( x : Int , y : Int ) => if ( x > y ) x else y max (1, 4) // 4
  • val numbers = Array (1, 2, 3, -1) numbers . map (( n ) => n * 2) // Array(2, 4, 6, -2) numbers . map ( _ * 2) int [] doubled = new int [arr. length ]; for ( int i = 0; i < arr. length ; i++) { doubled[i] = arr[i] * 2; }
  • public boolean hasUpperCase ( String text ) { boolean hasUpperCase = false ; for ( int i = 0; i < text . length (); i ++) { if ( Character . isUpperCase ( text . charAt ( i ))) { hasUpperCase = true ; break ; } } return hasUpperCase ; } def hasUpperCase ( text : String ) = text . exists ( _ . isUpperCase )
  • Pattern matching
  • arg match { case &quot;-h&quot; | &quot;-help&quot; => println ( &quot;Params: -help|-verbose&quot; ) case &quot;-v&quot; | &quot;-verbose&quot; => verbose = true }
  • val list = 1 :: 2 :: 3 :: Nil list match { case Nil => // Empty list case head :: tail => // head = 1, tail = List(2, 3) }
  • val tuple = (1, &quot;asd&quot; ) val ( one , asd ) = tuple
  • case class Person ( firstName : String , lastName : String ) val johnDoe = Person ( &quot;John&quot; , &quot;Doe&quot; ) val Person ( john , doe ) = johnDoe
  • QuickSort
  • Първи дубъл def qsort ( items : List [ Int ]) : List [ Int ] = { if ( items . length <= 1) return items var left : List [ Int ] = Nil var middle : List [ Int ] = Nil var right : List [ Int ] = Nil val pivot = items . head for ( item <- items ) { if ( item < pivot ) { left = item :: left } else if ( item > pivot ) { right = item :: right } else { middle = item :: middle } } qsort ( left ) ::: middle ::: qsort ( right ) }
  • Редно(2) дубъл def qsort ( items : List [ Int ]) = { items match { case Nil => Nil case xs => { val pivot = xs . head qsort ( xs . filter ( _ < pivot )) ::: xs . filter ( _ == pivot ) ::: qsort ( xs . filter ( _ > pivot )) } } }
  • Traits Multiple inheritance
  •  
  • trait Printer { def print ( doc : Document ) = new Sheet ( doc ) } trait Scanner { def scan ( sheet : Sheet ) = new Document ( sheet ) } trait Copier extends Printer with Scanner { def copy ( sheet : Sheet ) = print ( scan ( sheet )) }
  • trait Phone { def dial ( number : Int ) // Abstract } trait AnalogPhone extends Phone { def dial ( number : Int ) { /* rotate */ } } trait DigitalPhone extends Phone { def dial ( number : Int ) { /* send 0101101 */ } }
  • trait Fax { this: Phone => def fax ( number : Int ) { dial ( number ) /* from phone */ /* send fax */ } }
  • class DigitalFax extends Fax with DigitalPhone val analogFax = new Fax with AnalogPhone
  • class CoffeeMachine { def makeCoffee () = &quot;a nice cup of coffee&quot; } val allInOne = new CoffeeMachine with Fax with DigitalPhone with Copier /* with Printer with Scanner */
  • Dependency injection
  • trait Fax { this: Phone => def fax ( number : Int ) { dial ( number ) /* from phone */ /* send fax */ } } val analogFax = new Fax with Analog class DigitalFax extends Fax with DigitalPhone
  • Duck typing
  • class File { def close () { println ( &quot;closed the file&quot; ) } } class Socket { def close () { println ( &quot;socket unpluged&quot; ) } } object Duck { def main ( args : Array [ String ]) { closeIt ( new File ) closeIt ( new Socket ) } def closeIt ( x : ) { x . close () } }
  • class File { def close () { println ( &quot;closed the file&quot; ) } } class Socket { def close () { println ( &quot;socket unpluged&quot; ) } } object Duck { def main ( args : Array [ String ]) { closeIt ( new File ) closeIt ( new Socket ) } def closeIt ( x : { def close () } ) { x . close () } }
  • Съвместимост с Java
  • MD5 import java.security.MessageDigest def md5 ( x : String ) : String = { val md = MessageDigest getInstance &quot;MD5&quot; md update x . getBytes val md5 = md digest BigInt (1, md5 ) toString 16 }
  • Актьори
  • Actors demo
  • Инструменти
  • http://programming-scala.labs.oreilly.com/index.html Книги
  • scala-lang.org ibm.com/developerworks/views/java/libraryview.jsp?search_by=scala+neward Ресурси
  • emil.vladev [at] gmail.com bolddream.com