mirror of
https://github.com/extreme-tech-seminar/seven-languages-in-seven-weeks.git
synced 2024-11-29 03:00:18 +00:00
Scala
This commit is contained in:
parent
572953493a
commit
a0b648a203
2 changed files with 367 additions and 0 deletions
BIN
slides/edward-scissorhands-johnny-depp-180746_700_1225.jpg
Normal file
BIN
slides/edward-scissorhands-johnny-depp-180746_700_1225.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 122 KiB |
367
slides/scala.org
Normal file
367
slides/scala.org
Normal file
|
@ -0,0 +1,367 @@
|
|||
#+TITLE: Seven Languages in Seven Weeks
|
||||
#+BEAMER_HEADER: \subtitle{Scala}
|
||||
#+BEAMER_HEADER: \institute[INST]{Extreme Tech Seminar}
|
||||
#+AUTHOR: Correl Roush
|
||||
#+EMAIL: correl@gmail.com
|
||||
#+DATE: July 8, 2015
|
||||
#+OPTIONS: H:2 toc:nil ^:nil
|
||||
#+STARTUP: beamer indent
|
||||
#+COLUMNS: %45ITEM %10BEAMER_env(Env) %10BEAMER_act(Act) %4BEAMER_col(Col) %8BEAMER_opt(Opt)
|
||||
#+PROPERTY: BEAMER_col_ALL 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 0.0 :ETC
|
||||
#+LaTeX_CLASS: beamer
|
||||
#+LaTeX_CLASS_OPTIONS: [presentation,aspectratio=169]
|
||||
#+LaTeX_HEADER: \usemintedstyle{solarizeddark}
|
||||
|
||||
* Introduction
|
||||
** Introduction
|
||||
*** Scala :BMCOL:
|
||||
:PROPERTIES:
|
||||
:BEAMER_col: 0.7
|
||||
:END:
|
||||
- Created :: 2003
|
||||
- Author :: Martin Odersky
|
||||
|
||||
A multi-paradigm language on the JVM, bringing support for functional
|
||||
programming and a strong static type system.
|
||||
|
||||
*** Edward Scissorhands :BMCOL:
|
||||
:PROPERTIES:
|
||||
:BEAMER_col: 0.3
|
||||
:END:
|
||||
#+ATTR_LATEX: :width \textwidth
|
||||
[[file:edward-scissorhands.jpg]]
|
||||
** Getting Scala
|
||||
[[http://scala-lang.org/]]
|
||||
* Day 1
|
||||
** Day 1: The Castle on the Hill
|
||||
- Types and Expressions
|
||||
- Loops
|
||||
- Ranges and Tuples
|
||||
- Classes
|
||||
** Types
|
||||
Everything is an object.
|
||||
|
||||
#+begin_src scala
|
||||
1 + 1
|
||||
// 2
|
||||
|
||||
(1).+(1)
|
||||
// 2
|
||||
|
||||
"abc".size
|
||||
// 3
|
||||
#+end_src
|
||||
|
||||
** Expressions and Conditions
|
||||
#+begin_src scala
|
||||
5 < 6
|
||||
// true
|
||||
|
||||
5 <= 2
|
||||
// false
|
||||
|
||||
val a = 1
|
||||
val b = 2
|
||||
|
||||
if (a > b) {
|
||||
println("True")
|
||||
} else {
|
||||
println("False")
|
||||
}
|
||||
// False
|
||||
#+end_src
|
||||
|
||||
** Loops
|
||||
#+begin_src scala
|
||||
def whileLoop {
|
||||
var i = 1
|
||||
while(i <= 3) {
|
||||
println(i)
|
||||
i += 1
|
||||
}
|
||||
}
|
||||
def forLoop {
|
||||
println( "for loop using Java-style iteration" )
|
||||
for(i <- 0 until args.length) {
|
||||
println(args(i))
|
||||
}
|
||||
}
|
||||
def rubyStyleForLoop {
|
||||
println( "for loop using Ruby-style iteration" )
|
||||
args.foreach { arg =>
|
||||
println(arg)
|
||||
}
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** Ranges and Tuples
|
||||
#+begin_src scala
|
||||
val range = 0 until 10
|
||||
// Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
|
||||
range.start
|
||||
// 0
|
||||
range.end
|
||||
// 10
|
||||
range.step
|
||||
// 1
|
||||
|
||||
(0 to 10) by 5
|
||||
// Range(0, 5, 10)
|
||||
#+end_src
|
||||
|
||||
#+begin_src scala
|
||||
val person = ("Elvis", "Presley")
|
||||
person._1 // "Elvis"
|
||||
person._2 // "Presley"
|
||||
|
||||
val (x, y) = (1, 2)
|
||||
// x = 1, y = 2
|
||||
#+end_src
|
||||
|
||||
** Classes
|
||||
#+begin_src scala
|
||||
class Compass {
|
||||
val directions = List("north", "east", "south", "west")
|
||||
var bearing = 0
|
||||
print("Initial bearing: ")
|
||||
println(direction)
|
||||
|
||||
def direction() = directions(bearing)
|
||||
|
||||
def inform(turnDirection: String) {
|
||||
println("Turning " + turnDirection + ". Now bearing " + direction)
|
||||
}
|
||||
def turnRight() {
|
||||
bearing = (bearing + 1) % directions.size
|
||||
inform("right")
|
||||
}
|
||||
def turnLeft() {
|
||||
bearing = (bearing + (directions.size - 1)) % directions.size
|
||||
inform("left")
|
||||
}
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** Extending Classes
|
||||
- Companion Objects and Class Methods
|
||||
- Inheritance
|
||||
- Traits
|
||||
|
||||
** Exercises
|
||||
#+BEGIN_CENTER
|
||||
EXERCISES
|
||||
#+END_CENTER
|
||||
|
||||
* Day 2
|
||||
|
||||
** Day 2: Clipping Bushes and Other New Tricks
|
||||
- Simple Functions
|
||||
- Mutable and Immutable Variables
|
||||
- Collections
|
||||
** A Simple Function
|
||||
#+begin_src scala
|
||||
def double(x:Int):Int = {
|
||||
x * 2
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** var vs. val
|
||||
- var :: mutable
|
||||
- val :: immutable
|
||||
|
||||
#+BEGIN_QUOTE
|
||||
Mutable state limits concurrency.
|
||||
#+END_QUOTE
|
||||
|
||||
** Collections
|
||||
- Lists
|
||||
- Sets
|
||||
- Maps
|
||||
|
||||
** Any and Nothing
|
||||
*Any* is the root class in the Scala class hierarchy.
|
||||
|
||||
*Nothing* is a subtype of every type.
|
||||
|
||||
#+BEGIN_QUOTE
|
||||
Everything inherits from *Any*, and *Nothing* inherits from
|
||||
everything.
|
||||
#+END_QUOTE
|
||||
|
||||
** Collections and Functions
|
||||
- =foreach=
|
||||
|
||||
#+begin_src scala
|
||||
hobbits.foreach(hobbit => println(hobbit._1))
|
||||
// frodo
|
||||
// samwise
|
||||
// pippin
|
||||
#+end_src
|
||||
|
||||
- List methods (=isEmpty=, =length=, =size=)
|
||||
|
||||
#+begin_src scala
|
||||
list.isEmpty // Boolean = false
|
||||
Nil.isEmpty // Boolean = true
|
||||
list.head // java.lang.String = frodo
|
||||
list.tail // List[java.lang.string] = List(samwise, pippin)
|
||||
#+end_src
|
||||
|
||||
- =count=, =map=, =filter=, and others
|
||||
#+begin_src scala
|
||||
words.count(word => word.size > 2)
|
||||
words.filter(word => word.size > 2)
|
||||
words.map(word => word.size)
|
||||
words.exists(word => word.size > 4)
|
||||
#+end_src
|
||||
|
||||
** foldLeft
|
||||
#+begin_src scala
|
||||
val list = List(1, 2, 3)
|
||||
val sum = (0 /: list) {(sum, i) => sum + i}
|
||||
// sum: Int = 6
|
||||
#+end_src
|
||||
|
||||
- We invoke the operator with a value and a code block. The code block
|
||||
takes two arguments, =sum= and =i= .
|
||||
- Initially, =/:= takes the initial value, =0=, and the first element
|
||||
of =list=, =1=, and passes them into the code block. =sum= is =0=,
|
||||
=i= is =1=, and the result of =0 + 1= is =1= .
|
||||
- Next, =/:= takes =1=, the result returned from the code block, and
|
||||
folds it back into the calculation as =sum= . So, =sum= is =1= ; =i=
|
||||
is the next element of =list=, or =2=; and the result of the code
|
||||
block is =3=.
|
||||
- Finally, =/:= takes =3=, the result returned from the code block,
|
||||
and folds it back into the calculation as =sum=. So, =sum= is =3=;
|
||||
=i= is the next element of =list=, or =3=; and =sum + i= is =6=.
|
||||
|
||||
** Exercises
|
||||
#+BEGIN_CENTER
|
||||
EXERCISES
|
||||
#+END_CENTER
|
||||
|
||||
* Day 3
|
||||
|
||||
** Day 3: Cutting Through the Fluff
|
||||
- XML DSL
|
||||
- Pattern Matching
|
||||
- Guards
|
||||
- Regular Expressions
|
||||
- Concurrency
|
||||
** XML
|
||||
#+begin_src scala
|
||||
val movies =
|
||||
<movies>
|
||||
<movie genre="action">Pirates of the Caribbean</movie>
|
||||
<movie genre="fairytale">Edward Scissorhands</movie>
|
||||
</movies>
|
||||
|
||||
movies.text
|
||||
// String =
|
||||
//
|
||||
// Pirates of the Caribbean
|
||||
// Edward Scissorhands
|
||||
//
|
||||
#+end_src
|
||||
** Pattern Matching
|
||||
#+begin_src scala
|
||||
def doChore(chore: String): String = chore match {
|
||||
case "clean dishes" => "scrub, dry"
|
||||
case "cook dinner" => "chop, sizzle"
|
||||
case _ => "whine, complain"
|
||||
}
|
||||
|
||||
println(doChore("clean dishes"))
|
||||
// scrub, dry
|
||||
|
||||
println(doChore("mow lawn"))
|
||||
// whine, complain
|
||||
#+end_src
|
||||
|
||||
** Guards
|
||||
#+begin_src scala
|
||||
def factorial(n: Int): Int = n match {
|
||||
case 0 => 1
|
||||
case x if x > 0 => factorial(n - 1) * n
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** Regular Expressions
|
||||
#+begin_src scala
|
||||
val reg = """^(F|f)\w*""".r
|
||||
|
||||
println(reg.findFirstIn("Fantastic"))
|
||||
// Some(Fantastic)
|
||||
|
||||
println(reg.findFirstIn("not Fantastic"))
|
||||
// None
|
||||
#+end_src
|
||||
|
||||
** XML with Matching
|
||||
#+begin_src scala
|
||||
|
||||
val movies = <movies>
|
||||
<movie>The Incredibles</movie>
|
||||
<movie>WALL E</movie>
|
||||
<short>Jack Jack Attack</short>
|
||||
<short>Geri's Game</short>
|
||||
</movies>
|
||||
|
||||
(movies \ "_").foreach { movie =>
|
||||
movie match {
|
||||
case <movie>{movieName}</movie> => println(movieName)
|
||||
case <short>{shortName}</short> => println(shortName + " (short)")
|
||||
}
|
||||
}
|
||||
// The Incredibles
|
||||
// WALL E
|
||||
// Jack Jack Attack (short)
|
||||
// Geri's Game (short)
|
||||
#+end_src
|
||||
|
||||
** Concurrency
|
||||
#+begin_src scala
|
||||
import scala.actors._
|
||||
import scala.actors.Actor._
|
||||
|
||||
case object Poke
|
||||
case object Feed
|
||||
|
||||
class Kid() extends Actor {
|
||||
def act() {
|
||||
loop {
|
||||
react {
|
||||
case Poke => {
|
||||
println("Ow...")
|
||||
println("Quit it...")
|
||||
}
|
||||
case Feed => {
|
||||
println("Gurgle...")
|
||||
println("Burp...")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#+end_src
|
||||
|
||||
** Exercises
|
||||
#+BEGIN_CENTER
|
||||
EXERCISES
|
||||
#+END_CENTER
|
||||
|
||||
* Wrapping Up
|
||||
|
||||
** Wrapping Up Scala: Strengths
|
||||
- Concurrency
|
||||
- Evolution of Legacy Java
|
||||
- Domain-Specific Languages
|
||||
- XML
|
||||
- Bridging
|
||||
** Wrapping Up Scala: Weaknesses
|
||||
- Static Typing (with mixed paradigms)
|
||||
- Syntax
|
||||
- Mutability
|
||||
** Final Thoughts
|
||||
Scala represents a bridge between the large Java community and
|
||||
functional, concurrent programming.
|
Loading…
Reference in a new issue