Hello world
object   HelloWorld   { def  main ( args :   Array [ String ])   { println ( "Hello world!" ) } } public class  ...
Малък мащаб
scala>   var  peaks = Map(  |   "Musala" -> 2925,  |   "Rozhen" -> 1750  |  ) peaks:  scala.collection...
На високо ниво
Java public   boolean   hasUpperCase ( String text )   { boolean  hasUpperCase  =   false ; for   ( int  i  =   0;  i  <  ...
Scala def  hasUpperCase ( text :   String )  = text . exists ( _ . isUpperCase )
Експресивен
Java public  BigInteger  ????? ( BigInteger x )   { if   ( x  ==  BigInteger . ZERO )   { return  BigInteger . ONE ; } ret...
Java public  BigInteger  factorial ( BigInteger x )   { if   ( x  ==  BigInteger . ZERO )   { return  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 ) ...
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 . pass...
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;hell...
object   Basic   extends   Baysick   { def  main ( args : Array [ String ])   =   { 10   PRINT   &quot;Welcome to Baysick ...
val  worldSaver =   actor   { loop   { react   { case   SaveTheWorld ( when )   =>   saveTheWorldAfter ( when ) case   BeB...
Ф(у,н,к,ц,и,о,н,а,л,е,н) език
Защо cat File | grep println | wc
Функции ( x :   Int ,  y :   Int )   =>   if   ( x  >  y )  x  else  y val  max  =   ( x :   Int ,  y :   Int )   =>   if ...
val  numbers  =   Array (1,   2,   3,   -1) numbers . map (( n )   =>  n  *   2)   // Array(2, 4, 6, -2) numbers . map ( _...
public   boolean   hasUpperCase ( String text )   { boolean  hasUpperCase  =   false ; for   ( int  i  =   0;  i  <  text ...
Pattern matching
arg  match   { case   &quot;-h&quot;   |   &quot;-help&quot;   => println ( &quot;Params: -help|-verbose&quot; ) case   &q...
val  list  =   1   ::   2   ::   3   ::   Nil list  match   { case   Nil   =>   // Empty list case  head  ::  tail  =>   /...
val  tuple  =   (1,   &quot;asd&quot; ) val   ( one ,  asd )   =  tuple
case   class   Person ( firstName :   String , lastName :   String ) val  johnDoe  =   Person ( &quot;John&quot; ,   &quot...
QuickSort
Първи дубъл def  qsort ( items :   List [ Int ]) :   List [ Int ]   =   { if   ( items . length  <=   1)   return  items v...
Редно(2)  дубъл def  qsort ( items :   List [ Int ])   =   { items  match   { case   Nil   =>   Nil case  xs  =>   { val  ...
Traits Multiple inheritance
 
trait   Printer   { def  print ( doc :   Document )   =   new   Sheet ( doc ) } trait   Scanner   { def  scan ( sheet :   ...
trait   Phone   { def  dial ( number :   Int )   // Abstract } trait   AnalogPhone   extends   Phone   { def  dial ( numbe...
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   CoffeeMachi...
Dependency injection
trait   Fax   { this:   Phone   => def  fax ( number :   Int )   { dial ( number )  /* from phone */ /* send fax */ } } va...
Duck typing
class   File   { def  close ()   {  println ( &quot;closed the file&quot; )   } } class   Socket   { def  close ()   {  pr...
class   File   { def  close ()   {  println ( &quot;closed the file&quot; )   } } class   Socket   { def  close ()   {  pr...
Съвместимост с Java
MD5 import   java.security.MessageDigest def  md5 ( x :   String ) :   String   =   { val  md  =   MessageDigest  getInsta...
Актьори
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
Upcoming SlideShare
Loading in...5
×

Scala 2 + 2 > 4

2,151

Published on

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,151
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
39
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Scala 2 + 2 > 4

  1. 1. Hello world
  2. 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; ); } }
  3. 3. Малък мащаб
  4. 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)
  5. 5. На високо ниво
  6. 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. 7. Scala def hasUpperCase ( text : String ) = text . exists ( _ . isUpperCase )
  8. 8. Експресивен
  9. 9. Java public BigInteger ????? ( BigInteger x ) { if ( x == BigInteger . ZERO ) { return BigInteger . ONE ; } return x . multiply ( ?????( x . subtract ( BigInteger . ONE ))); }
  10. 10. Java public BigInteger factorial ( BigInteger x ) { if ( x == BigInteger . ZERO ) { return BigInteger . ONE ; } return x . multiply ( factorial ( x . subtract ( BigInteger . ONE ))); }
  11. 11. def factorial ( x : BigInt ) = if ( x == 0) 1 else x * factorial ( x - 1) Scala
  12. 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. 13. class Person ( var name : String , var age : int ) Scala
  14. 14. Turtles all the way down http://en.wikipedia.org/wiki/Turtles_all_the_way_down
  15. 15. 1 + 2 1.+(2) 1 to 8 // => Range.Inclusive(1, 8) 1.to(8)
  16. 16. Прагматичен
  17. 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. 18. DSLs Growing a language http://video.google.com/videoplay?docid=-8860158196198824415
  19. 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. 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. 21. val worldSaver = actor { loop { react { case SaveTheWorld ( when ) => saveTheWorldAfter ( when ) case BeBad => // Ignore it - we are good! } } } worldSaver ! SaveTheWorld ( new Date )
  22. 22. Ф(у,н,к,ц,и,о,н,а,л,е,н) език
  23. 23. Защо cat File | grep println | wc
  24. 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. 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. 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 )
  27. 27. Pattern matching
  28. 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. 29. val list = 1 :: 2 :: 3 :: Nil list match { case Nil => // Empty list case head :: tail => // head = 1, tail = List(2, 3) }
  30. 30. val tuple = (1, &quot;asd&quot; ) val ( one , asd ) = tuple
  31. 31. case class Person ( firstName : String , lastName : String ) val johnDoe = Person ( &quot;John&quot; , &quot;Doe&quot; ) val Person ( john , doe ) = johnDoe
  32. 32. QuickSort
  33. 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. 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 )) } } }
  35. 35. Traits Multiple inheritance
  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 )) }
  37. 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 */ } }
  38. 39. trait Fax { this: Phone => def fax ( number : Int ) { dial ( number ) /* from phone */ /* send fax */ } }
  39. 40. class DigitalFax extends Fax with DigitalPhone val analogFax = new Fax with AnalogPhone
  40. 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 */
  41. 42. Dependency injection
  42. 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
  43. 44. Duck typing
  44. 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 () } }
  45. 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 () } }
  46. 47. Съвместимост с Java
  47. 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 }
  48. 49. Актьори
  49. 50. Actors demo
  50. 51. Инструменти
  51. 52. http://programming-scala.labs.oreilly.com/index.html Книги
  52. 53. scala-lang.org ibm.com/developerworks/views/java/libraryview.jsp?search_by=scala+neward Ресурси
  53. 54. emil.vladev [at] gmail.com bolddream.com
  1. A particular slide catching your eye?

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

×