progs/lecture5.scala
changeset 508 832d1e5d601b
parent 507 2e3945ff7b66
equal deleted inserted replaced
507:2e3945ff7b66 508:832d1e5d601b
     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