Scala
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,644
On Slideshare
4,401
From Embeds
243
Number of Embeds
9

Actions

Shares
Downloads
47
Comments
0
Likes
2

Embeds 243

http://biwak-agh.blogspot.com 217
http://dev.localhost 15
http://localhost 3
http://www.linkedin.com 2
https://www.linkedin.com 2
http://static.slideshare.net 1
http://www.biwak-agh.blogspot.com 1
http://www.slideshare.net 1
http://biwak-agh.blogspot.se 1

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. Wstęp O języku Przykłady BIWAK Scali czyli Scala w domu i zagrodzie Krzysztof Goj Koło Naukowe Informatyków BIT 3 grudnia 2008 Krzysztof Goj BIWAK Scali
  • 2. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 3. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 4. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 5. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 6. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 7. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 8. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 9. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 10. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 11. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 12. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 13. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 14. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 15. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 16. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 17. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 18. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 19. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 20. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 21. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 22. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 23. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 24. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 25. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 26. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 27. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 28. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 29. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 30. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 31. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 32. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 33. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 34. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 35. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 36. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 37. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 38. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 39. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 40. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 41. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 42. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 43. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 44. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 45. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 46. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 47. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Domain Specific Languages Zewnętrzne (np. Make) Wewnętrzne (np. Rake) Krzysztof Goj BIWAK Scali
  • 48. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Domain Specific Languages Zewnętrzne (np. Make) Wewnętrzne (np. Rake) Krzysztof Goj BIWAK Scali
  • 49. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Domain Specific Languages Zewnętrzne (np. Make) Wewnętrzne (np. Rake) Krzysztof Goj BIWAK Scali
  • 50. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Wewnętrzny DSL w Scali — Specs object helloWorld extends Specification { quot;’Hello, World!’ has 13 charactersquot; in { quot;Hello, World!quot;.size mustEqual 13 } quot;’Hello, World!’ matches /H.*W.*d.?/ regexpquot; in { quot;Hello, World!quot; must beMatching(quot;H.*W.*d.?quot;) } } Krzysztof Goj BIWAK Scali
  • 51. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 52. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 53. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 54. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 55. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 56. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 57. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne traity pattern matching składnia dla XML-a inferencja typów domknięcia funkcyjne funkcje anonimowe implicit conversions implicit parameters for comprehensions i monady elastyczny system typów Krzysztof Goj BIWAK Scali
  • 58. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Przykłady Krzysztof Goj BIWAK Scali
  • 59. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Haskell map (1+) [1, 2, 3] Ruby [1, 2, 3].map {|i| i+1} Scheme (Lisp) (map (lambda (n) (1+ n)) ’(1 2 3)) Python [n+1 for n in [1, 2, 3]] Erlang lists:map(fun(N) -> N+1 end, [1, 2, 3]). Krzysztof Goj BIWAK Scali
  • 60. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Java import java.util.List; import java.util.ArrayList; import static java.util.Arrays.asList; interface Function<Result, Arg> { public Result execute(Arg arg); } public class MapExample { public static<Result, Arg> List<Result> map(Function<Result, Arg> fn, Iterable<Arg> iter) { List<Result> result = new ArrayList<Result>(); for (Arg i: iter) result.add(fn.execute(i)); return result; } public static void main(String[] args) { map(new Function<Integer, Integer>() { public Integer execute(Integer i) { return i + 1; } }, asList(1, 2, 3)); } } Krzysztof Goj BIWAK Scali
  • 61. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Scala object MapExample extends Application { def increase(n: Int): Int = { return n + 1; } Array(1, 2, 3).map(increase); } Scala — którka funkcja object MapExample extends Application { def increase(n: Int): Int = n + 1; Array(1, 2, 3).map(increase); } Scala — inferencja typów object MapExample extends Application { def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); } Krzysztof Goj BIWAK Scali
  • 62. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Scala object MapExample extends Application { def increase(n: Int): Int = { return n + 1; } Array(1, 2, 3).map(increase); } Scala — którka funkcja object MapExample extends Application { def increase(n: Int): Int = n + 1; Array(1, 2, 3).map(increase); } Scala — inferencja typów object MapExample extends Application { def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); } Krzysztof Goj BIWAK Scali
  • 63. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Scala object MapExample extends Application { def increase(n: Int): Int = { return n + 1; } Array(1, 2, 3).map(increase); } Scala — którka funkcja object MapExample extends Application { def increase(n: Int): Int = n + 1; Array(1, 2, 3).map(increase); } Scala — inferencja typów object MapExample extends Application { def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); } Krzysztof Goj BIWAK Scali
  • 64. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 65. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 66. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 67. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 68. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 69. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające takaSkładnia.setJestBrzydka(true) Settery i gettery class DateError extends Exception class TimeOfDayVar { private var h, m, s: Int = 0 def hours = h def hours_= (h: Int) = if (0 <= h && h < 24) this.h = h else throw new DateError() // ... } def main(args: Array[String]) { val d = new TimeOfDayVar d.hours = 8; d.minutes = 30; d.seconds = 0 d.hours = 25 // throws a DateError exception } Krzysztof Goj BIWAK Scali
  • 70. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Implicit Conversions silnia def fact(n: Int): BigInt = if (n > 0) BigInt(n) * fact(n-1) else 1 implicit def enrich(n: Int) = new { def !(): BigInt = fact(n) } println(42!) 1405006117752879898543142606244511569936384000000000 Krzysztof Goj BIWAK Scali
  • 71. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Implicit Conversions silnia def fact(n: Int): BigInt = if (n > 0) BigInt(n) * fact(n-1) else 1 implicit def enrich(n: Int) = new { def !(): BigInt = fact(n) } println(42!) 1405006117752879898543142606244511569936384000000000 Krzysztof Goj BIWAK Scali
  • 72. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 73. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 74. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 75. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 76. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Opcje Opcje import scala.collection.mutable.HashMap val numbers = HashMap(0 -> quot;nicquot;, 1 -> quot;jednoquot;, 2 -> quot;dwaquot;) val rnd = new Random numbers get rnd.nextInt(7) match { case Some(name) => println(quot;To quot; + name) case None => println(quot;Dużoquot;) } println(numbers get rnd.nextInt(7) map {_.capitalize + quot;!quot;} getOrElse quot;DUŻO!!!quot;) Krzysztof Goj BIWAK Scali
  • 77. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające ScalaCheck — QuickCheck i więcej ScalaCheck import org.scalacheck._ object StringSpecification extends Properties(quot;Stringquot;) { specify(quot;startsWithquot;, (a: String, b: String) => (a+b).startsWith(a)) specify(quot;endsWithquot;, (a: String, b: String) => (a+b).endsWith(b)) // Is this really always true? specify(quot;concatquot;, (a: String, b: String) => (a+b).length > a.length && (a+b).length > b.length ) specify(quot;substringquot;, (a: String, b: String) => (a+b).substring(a.length) == b ) specify(quot;substringquot;, (a: String, b: String, c: String) => (a+b+c).substring(a.length, a.length+b.length) == b ) } Krzysztof Goj BIWAK Scali
  • 78. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Traity Trait ordered trait Ordered[A] { def compare(that: A): Int def < (that: A): Boolean = (this compare that) < 0 def > (that: A): Boolean = (this compare that) > 0 def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) } Użycie class Sth(val a: Int) extends Ordered[Sth] { override def compare(other: Sth) = { val b = other.a (a*a) compare (b*b) } } val rnd = new Random println(if (new Sth(-3) < new Sth(rnd nextInt 5)) quot;Yesquot; else quot;Noquot;) Krzysztof Goj BIWAK Scali
  • 79. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Traity Trait ordered trait Ordered[A] { def compare(that: A): Int def < (that: A): Boolean = (this compare that) < 0 def > (that: A): Boolean = (this compare that) > 0 def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) } Użycie class Sth(val a: Int) extends Ordered[Sth] { override def compare(other: Sth) = { val b = other.a (a*a) compare (b*b) } } val rnd = new Random println(if (new Sth(-3) < new Sth(rnd nextInt 5)) quot;Yesquot; else quot;Noquot;) Krzysztof Goj BIWAK Scali
  • 80. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Domknięcia Zapis var counter = 0 def bump_up() { counter += 1 } Odczyt def outer(a: Int): Int = { def helper(b: Int) = a * a - b helper(4) + helper(a-1) } Krzysztof Goj BIWAK Scali
  • 81. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Domknięcia Zapis var counter = 0 def bump_up() { counter += 1 } Odczyt def outer(a: Int): Int = { def helper(b: Int) = a * a - b helper(4) + helper(a-1) } Krzysztof Goj BIWAK Scali
  • 82. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Domknięcia Licznik — patologicznik def mkCounter() = { var soFar = 0 def counter(n: Int) = { soFar += n soFar } counter _ } val cnt1 = mkCounter() val cnt2 = mkCounter() cnt1(1); cnt1(30) println(cnt1(11)) println(cnt2(7)) wypisze 42 i 7 Krzysztof Goj BIWAK Scali
  • 83. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – tworzenie XML case class Person(name: String, age: Int) class AddressBook(a: Person*) { private val people: List[Person] = a.toList def toXHTML = <table class=quot;XMLquot;> <tr> <th>Last Name</th> <th>First Name</th> </tr> { for (val p <- people) yield <tr> <td>{ p.name }</td> <td>{ p.age.toString }</td> </tr> } </table>; } Krzysztof Goj BIWAK Scali
  • 84. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – wyszukiwanie 1/3 XML def understandFakt(note: scala.xml.Node): String = note match { case <murder> <criminal> <name>{murdererName}</name> <age>{murderAge}</age> </criminal> <victim><name>{victimName}</name>{_*}</victim> </murder> => quot;ZBRODNIA! quot; + murderAge + quot;-letni quot; + murderAge + quot; zabił quot; + quot; quot; + victimName case <advert>{content}</advert> => quot;Kupuj quot; + content case _ => quot;prognoza pogody: będzie padaćquot; } Krzysztof Goj BIWAK Scali
  • 85. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – wyszukiwanie 2/3 XML val stuff = <badStuff> <newspapers> <newspaper title=quot;Nasz Dziennikquot;>...</newspaper> <newspaper title=quot;NIEquot;>...</newspaper> <newspaper title=quot;Faktquot;> <frontPage> <advert>Fakt</advert> <pogoda/> </frontPage> </newspaper> </newspapers> </badStuff> Krzysztof Goj BIWAK Scali
  • 86. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – wyszukiwanie 3/3 XML for { val paper <- stuff quot;newspapersquot; quot;newspaperquot; paper.attributes(quot;titlequot;) == quot;Faktquot; val frontPage <- paper quot;frontPagequot; val article <- frontPage child } println(understandFakt(article)) Krzysztof Goj BIWAK Scali
  • 87. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – definicja class Stack[+A] { def push[B >: A](elem: B): Stack[B] = new Stack[B] { override def top: B = elem override def pop: Stack[B] = Stack.this override def toString() = Stack.this.toString() + quot; quot; + elem.toString() } def top: A = error(quot;no element on stackquot;) def pop: Stack[A] = error(quot;no element on stackquot;) override def toString() = quot;quot; } hierarchia klas Krzysztof Goj BIWAK Scali
  • 88. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 89. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 90. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 91. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 92. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 93. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 94. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 95. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 96. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 97. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 98. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 99. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Hierarchia typów stack.scala Krzysztof Goj BIWAK Scali
  • 100. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Funkcja trait Function1[-T1, +R] Krzysztof Goj BIWAK Scali
  • 101. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Implicit Parameters Powtórka z algebry abstract class SemiGroup[A] { def add(x: A, y: A): A } abstract class Monoid[A] extends SemiGroup[A] { def unit: A } implicit object StringMonoid extends Monoid[String] { def add(x: String, y: String): String = x concat y def unit: String = quot;quot; } implicit object IntMonoid extends Monoid[int] { def add(x: Int, y: Int): Int = x + y def unit: Int = 0 } def sum[A](xs: List[A])(implicit m: Monoid[A]): A = (m.unit /: xs)(m.add) println(sum(List(1, 2, 3))) println(sum(List(quot;aquot;, quot;bquot;, quot;cquot;))) Krzysztof Goj BIWAK Scali
  • 102. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Parser Combinators Prosty Kalkulator import scala.util.parsing.combinator.lexical.StdLexical import scala.util.parsing.combinator.syntactical.StdTokenParsers object arithmeticParser extends StdTokenParsers { type Tokens = StdLexical ; val lexical = new StdLexical lexical.delimiters ++= List(quot;(quot;, quot;)quot;, quot;+quot;, quot;-quot;, quot;*quot;, quot;/quot;) lazy val expr = term*(quot;+quot; ^^^ {(x: Int, y: Int) => x + y} | quot;-quot; ^^^ {(x: Int, y: Int) => x - y}) lazy val term = factor*(quot;*quot; ^^^ {(x: Int, y: Int) => x * y} | quot;/quot; ^^^ {(x: Int, y: Int) => x / y}) lazy val factor: Parser[Int] = quot;(quot; ~> expr <~ quot;)quot; | numericLit ^^ (_.toInt) def eval(str: String) = expr(new lexical.Scanner(str)) } println(arithmeticParser.eval(quot;4 * (5+5) + 8/4quot;).get) Krzysztof Goj BIWAK Scali
  • 103. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Parser Combinators Prosty Kalkulator import scala.util.parsing.combinator.lexical.StdLexical import scala.util.parsing.combinator.syntactical.StdTokenParsers object arithmeticParser extends StdTokenParsers { type Tokens = StdLexical ; val lexical = new StdLexical lexical.delimiters ++= List(quot;(quot;, quot;)quot;, quot;+quot;, quot;-quot;, quot;*quot;, quot;/quot;) lazy val expr = term*(quot;+quot; ^^^ {(x: Int, y: Int) => x + y} | quot;-quot; ^^^ {(x: Int, y: Int) => x - y}) lazy val term = factor*(quot;*quot; ^^^ {(x: Int, y: Int) => x * y} | quot;/quot; ^^^ {(x: Int, y: Int) => x / y}) lazy val factor: Parser[Int] = quot;(quot; ~> expr <~ quot;)quot; | numericLit ^^ (_.toInt) def eval(str: String) = expr(new lexical.Scanner(str)) } println(arithmeticParser.eval(quot;4 * (5+5) + 8/4quot;).get) Krzysztof Goj BIWAK Scali
  • 104. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 105. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 106. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 107. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 108. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 109. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 110. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 111. Do poczytania Zakończenie Dziękuję Dobranoc! Krzysztof Goj BIWAK Scali