diff -r 28f78d9081d7 -r 2e3945ff7b66 progs/lecture4.scala --- a/progs/lecture4.scala Fri Dec 05 10:20:00 2025 +0000 +++ b/progs/lecture4.scala Thu Dec 11 13:23:30 2025 +0000 @@ -37,7 +37,7 @@ length(List(1, 2, 3, 4)) -length[String](List(1, 2, 3, 4)) +length[Int](List(1, 2, 3, 4)) def map[A, B](lst: List[A], f: A => B): List[B] = lst match { @@ -247,9 +247,13 @@ // Tail recursion //================ +@tailrec def fact(n: BigInt): BigInt = if (n == 0) 1 else n * fact(n - 1) +fact(3) -> fact(2) + + fact(10) fact(1000) @@ -260,7 +264,7 @@ if (n == 0) acc else factT(n - 1, n * acc) -factT(1000,1) +factT(10,1) println(factT(100000, 1)) @@ -303,14 +307,17 @@ case _ :: tail => 1 + length(tail) } -length(List.fill(100000)(1)) +val long_lst = List.fill(100000)(1) + +length(long_lst) +long_lst.length def lengthT[A](xs: List[A], acc : Int = 0) : Int = xs match { case Nil => acc case _ :: tail => lengthT(tail, 1 + acc) } -lengthT(List.fill(100000)(1)) + @@ -628,15 +635,15 @@ // Regular expressions - the power of DSLs in Scala //================================================== -abstract class Rexp -case object ZERO extends Rexp // nothing -case object ONE extends Rexp // the empty string -case class CHAR(c: Char) extends Rexp // a character c -case class ALT(r1: Rexp, r2: Rexp) extends Rexp // alternative r1 + r2 -case class SEQ(r1: Rexp, r2: Rexp) extends Rexp // sequence r1 . r2 -case class STAR(r: Rexp) extends Rexp // star r* - - +enum Rexp { + case ZERO // nothing + case ONE // the empty string + case CHAR(c: Char) // a character c + case ALT(r1: Rexp, r2: Rexp) // alternative r1 + r2 + case SEQ(r1: Rexp, r2: Rexp) // sequence r1 . r2 + case STAR(r: Rexp) // star r* +} +import Rexp._ // writing (ab)* in the format above is // tedious @@ -676,7 +683,15 @@ val number = sign ~ digit ~ digit.% +extension (n: Int) { + def ++ = n + 1 +} +def --(n: Int) = n - 1 + +val n = 3 +val m = (n.++) +val k = --(n) // In mandelbrot.scala I used complex (imaginary) numbers // and implemented the usual arithmetic operations for complex