progs/lecture4.scala
changeset 507 2e3945ff7b66
parent 491 2a30c7dfe3ed
--- 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