progs/lecture5.scala
changeset 508 832d1e5d601b
parent 507 2e3945ff7b66
--- a/progs/lecture5.scala	Thu Dec 11 13:23:30 2025 +0000
+++ b/progs/lecture5.scala	Mon Dec 15 18:42:41 2025 +0000
@@ -1,7 +1,9 @@
 // Scala Lecture 5
 //=================
 
+// reading of URLs / files
 // (Immutable) OOP
+// being lazy in Scala
 
 
 import scala.util._      // Try,...
@@ -10,11 +12,9 @@
 val my_url = "https://urbanchr.github.io/"
 
 
-
+Source.fromURL(my_url ++ "foo")(using "ISO-8859-1").mkString
 
-Source.fromURL(my_url)(using "ISO-8859-1").mkString
-
-Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString).toOption
+Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString.take(100)).toOption
 
 Try(Source.fromURL(my_url)(using "ISO-8859-1").mkString).getOrElse("")
 
@@ -29,12 +29,18 @@
 def get_contents(name: String) : List[String] = 
   Try(Source.fromURL(name)(using "ISO-8859-1").getLines().toList).getOrElse(Nil)
 
-get_contents(my_url)
+get_contents(my_url + "foo")
 
 
 // Object Oriented Programming in Scala
 // =====================================
 
+def map(xs: List[Int], f : Int => Int) : List[Int] = ???
+
+map(List(1,2,3,4), _ + 1)
+
+List(1,2,3,4).map(_ + 1)
+
 
 abstract class Animal 
 case class Bird(name: String) extends Animal {
@@ -384,18 +390,18 @@
 enuml(1, "a").size
 enuml(2, "a").size
 enuml(3, "a").size 
-enuml(4, "a").size // out of heap space
+// enuml(4, "a").size // out of heap space after several minutes
 
 
-def enum(rs: LazyList[Rexp]) : LazyList[Rexp] = 
-  rs #::: enum( (for (r1 <- rs; r2 <- rs) yield ALT(r1, r2)) #:::
+def enm(rs: LazyList[Rexp]) : LazyList[Rexp] = 
+  rs #::: enm( (for (r1 <- rs; r2 <- rs) yield ALT(r1, r2)) #:::
                 (for (r1 <- rs; r2 <- rs) yield SEQ(r1, r2)) #:::
                 (for (r1 <- rs) yield STAR(r1)) )
 
 
-enum(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(200).force
-enum(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(5_000_000).force // out of memory
-
+enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(200).force
+enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(5_000_000).force
+enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).take(10_000_000).force // runs out of space
 
 def depth(r: Rexp) : Int = r match {
   case ZERO => 0
@@ -406,9 +412,12 @@
   case STAR(r1) => depth(r1) + 1
 }
 
+enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b'))).dropWhile(depth(_) < 3).take(5_000).force
+
+
 
 val is = 
-  (enum(LazyList(ZERO, ONE, CHAR('a'), CHAR('b')))
+  (enm(LazyList(ZERO, ONE, CHAR('a'), CHAR('b')))
     .dropWhile(depth(_) < 3)
     .take(10).foreach(println))