Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
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

More Related Content

Scala 2 + 2 > 4

  • 2. object HelloWorld { def main ( args : Array [ String ]) { println ( &quot;Hello world!&quot; ) } } public class HelloWorld { public static void main ( String [] args ) { System . out . println ( &quot;Hello world&quot; ); } }
  • 4. scala> var peaks = Map( | &quot;Musala&quot; -> 2925, | &quot;Rozhen&quot; -> 1750 | ) peaks: scala.collection.immutable.Map[java.lang.String,Int] = Map(Musala -> 2925, Rozhen -> 1750) scala> peaks += &quot;Botev&quot; -> 2376 scala> println(peaks) Map(Musala -> 2925, Rozhen -> 1750, Botev -> 2376)
  • 6. 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 ; }
  • 7. Scala def hasUpperCase ( text : String ) = text . exists ( _ . isUpperCase )
  • 9. Java public BigInteger ????? ( BigInteger x ) { if ( x == BigInteger . ZERO ) { return BigInteger . ONE ; } return x . multiply ( ?????( x . subtract ( BigInteger . ONE ))); }
  • 10. Java public BigInteger factorial ( BigInteger x ) { if ( x == BigInteger . ZERO ) { return BigInteger . ONE ; } return x . multiply ( factorial ( x . subtract ( BigInteger . ONE ))); }
  • 11. def factorial ( x : BigInt ) = if ( x == 0) 1 else x * factorial ( x - 1) Scala
  • 12. 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 ; } }
  • 13. class Person ( var name : String , var age : int ) Scala
  • 14. Turtles all the way down http://en.wikipedia.org/wiki/Turtles_all_the_way_down
  • 15. 1 + 2 1.+(2) 1 to 8 // => Range.Inclusive(1, 8) 1.to(8)
  • 17. 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;
  • 18. DSLs Growing a language http://video.google.com/videoplay?docid=-8860158196198824415
  • 19. 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; ) } }
  • 20. 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
  • 21. val worldSaver = actor { loop { react { case SaveTheWorld ( when ) => saveTheWorldAfter ( when ) case BeBad => // Ignore it - we are good! } } } worldSaver ! SaveTheWorld ( new Date )
  • 23. Защо cat File | grep println | wc
  • 24. Функции ( 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
  • 25. 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; }
  • 26. 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 )
  • 28. arg match { case &quot;-h&quot; | &quot;-help&quot; => println ( &quot;Params: -help|-verbose&quot; ) case &quot;-v&quot; | &quot;-verbose&quot; => verbose = true }
  • 29. val list = 1 :: 2 :: 3 :: Nil list match { case Nil => // Empty list case head :: tail => // head = 1, tail = List(2, 3) }
  • 30. val tuple = (1, &quot;asd&quot; ) val ( one , asd ) = tuple
  • 31. case class Person ( firstName : String , lastName : String ) val johnDoe = Person ( &quot;John&quot; , &quot;Doe&quot; ) val Person ( john , doe ) = johnDoe
  • 33. Първи дубъл 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 ) }
  • 34. Редно(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 )) } } }
  • 36.  
  • 37. 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 )) }
  • 38. 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 */ } }
  • 39. trait Fax { this: Phone => def fax ( number : Int ) { dial ( number ) /* from phone */ /* send fax */ } }
  • 40. class DigitalFax extends Fax with DigitalPhone val analogFax = new Fax with AnalogPhone
  • 41. 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 */
  • 43. 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
  • 45. 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 () } }
  • 46. 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 () } }
  • 48. 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 }
  • 54. emil.vladev [at] gmail.com bolddream.com