1 // Scala Lecture 5 |
1 // Scala Lecture 5 |
2 //================= |
2 //================= |
3 |
3 |
|
4 // reading of URLs / files |
4 // (Immutable) OOP |
5 // (Immutable) OOP |
|
6 // being lazy in Scala |
5 |
7 |
6 |
8 |
7 import scala.util._ // Try,... |
9 import scala.util._ // Try,... |
8 import io.Source // fromURL |
10 import io.Source // fromURL |
9 |
11 |
10 val my_url = "https://urbanchr.github.io/" |
12 val my_url = "https://urbanchr.github.io/" |
11 |
13 |
12 |
14 |
13 |
15 Source.fromURL(my_url ++ "foo")(using "ISO-8859-1").mkString |
14 |
16 |
15 Source.fromURL(my_url)(using "ISO-8859-1").mkString |
17 Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString.take(100)).toOption |
16 |
|
17 Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString).toOption |
|
18 |
18 |
19 Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString).getOrElse("") |
19 Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString).getOrElse("") |
20 |
20 |
21 |
21 |
22 // the same for files |
22 // the same for files |
27 // (lines) from files... |
27 // (lines) from files... |
28 // |
28 // |
29 def get_contents(name: String) : List[String] = |
29 def get_contents(name: String) : List[String] = |
30 Try(Source.fromURL(name)(using "ISO-8859-1").getLines().toList).getOrElse(Nil) |
30 Try(Source.fromURL(name)(using "ISO-8859-1").getLines().toList).getOrElse(Nil) |
31 |
31 |
32 get_contents(my_url) |
32 get_contents(my_url + "foo") |
33 |
33 |
34 |
34 |
35 // Object Oriented Programming in Scala |
35 // Object Oriented Programming in Scala |
36 // ===================================== |
36 // ===================================== |
|
37 |
|
38 def map(xs: List[Int], f : Int => Int) : List[Int] = ??? |
|
39 |
|
40 map(List(1,2,3,4), _ + 1) |
|
41 |
|
42 List(1,2,3,4).map(_ + 1) |
37 |
43 |
38 |
44 |
39 abstract class Animal |
45 abstract class Animal |
40 case class Bird(name: String) extends Animal { |
46 case class Bird(name: String) extends Animal { |
41 override def toString = name |
47 override def toString = name |
382 |
388 |
383 enuml(1, "a") |
389 enuml(1, "a") |
384 enuml(1, "a").size |
390 enuml(1, "a").size |
385 enuml(2, "a").size |
391 enuml(2, "a").size |
386 enuml(3, "a").size |
392 enuml(3, "a").size |
387 enuml(4, "a").size // out of heap space |
393 // enuml(4, "a").size // out of heap space after several minutes |
388 |
394 |
389 |
395 |
390 def enum(rs: LazyList[Rexp]) : LazyList[Rexp] = |
396 def enm(rs: LazyList[Rexp]) : LazyList[Rexp] = |
391 rs #::: enum( (for (r1 <- rs; r2 <- rs) yield ALT(r1, r2)) #::: |
397 rs #::: enm( (for (r1 <- rs; r2 <- rs) yield ALT(r1, r2)) #::: |
392 (for (r1 <- rs; r2 <- rs) yield SEQ(r1, r2)) #::: |
398 (for (r1 <- rs; r2 <- rs) yield SEQ(r1, r2)) #::: |
393 (for (r1 <- rs) yield STAR(r1)) ) |
399 (for (r1 <- rs) yield STAR(r1)) ) |
394 |
400 |
395 |
401 |
396 enum(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(200).force |
402 enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(200).force |
397 enum(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(5_000_000).force // out of memory |
403 enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(5_000_000).force |
398 |
404 enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(10_000_000).force // runs out of space |
399 |
405 |
400 def depth(r: Rexp) : Int = r match { |
406 def depth(r: Rexp) : Int = r match { |
401 case ZERO => 0 |
407 case ZERO => 0 |
402 case ONE => 0 |
408 case ONE => 0 |
403 case CHAR(_) => 0 |
409 case CHAR(_) => 0 |
404 case ALT(r1, r2) => Math.max(depth(r1), depth(r2)) + 1 |
410 case ALT(r1, r2) => Math.max(depth(r1), depth(r2)) + 1 |
405 case SEQ(r1, r2) => Math.max(depth(r1), depth(r2)) + 1 |
411 case SEQ(r1, r2) => Math.max(depth(r1), depth(r2)) + 1 |
406 case STAR(r1) => depth(r1) + 1 |
412 case STAR(r1) => depth(r1) + 1 |
407 } |
413 } |
408 |
414 |
|
415 enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).dropWhile(depth(_) < 3).take(5_000).force |
|
416 |
|
417 |
409 |
418 |
410 val is = |
419 val is = |
411 (enum(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))) |
420 (enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))) |
412 .dropWhile(depth(_) < 3) |
421 .dropWhile(depth(_) < 3) |
413 .take(10).foreach(println)) |
422 .take(10).foreach(println)) |
414 |
423 |
415 |
424 |
416 |
425 |