Your SlideShare is downloading. ×
0
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Scala 2 + 2 > 4
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Scala 2 + 2 > 4

2,139

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,139
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
39
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Hello world
  • 2. object HelloWorld { def main ( args : Array [ String ]) { println ( "Hello world!" ) } } public class HelloWorld { public static void main ( String [] args ) { System . out . println ( "Hello world" ); } }
  • 3. Малък мащаб
  • 4. 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)
  • 5. На високо ниво
  • 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 )
  • 8. Експресивен
  • 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)
  • 16. Прагматичен
  • 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 )
  • 22. Ф(у,н,к,ц,и,о,н,а,л,е,н) език
  • 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 )
  • 27. Pattern matching
  • 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
  • 32. QuickSort
  • 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 )) } } }
  • 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 )) }
  • 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 */
  • 42. Dependency injection
  • 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
  • 44. Duck typing
  • 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 () } }
  • 47. Съвместимост с Java
  • 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 }
  • 49. Актьори
  • 50. Actors demo
  • 51. Инструменти
  • 52. http://programming-scala.labs.oreilly.com/index.html Книги
  • 53. scala-lang.org ibm.com/developerworks/views/java/libraryview.jsp?search_by=scala+neward Ресурси
  • 54. emil.vladev [at] gmail.com bolddream.com

×