|      3  |      3  | 
|      4 // - List, Sets, Strings, ...  |      4 // - List, Sets, Strings, ...  | 
|      5 // - Value assignments (val vs var) |      5 // - Value assignments (val vs var) | 
|      6 // - How to define functions? (What is returned?) |      6 // - How to define functions? (What is returned?) | 
|      7 // - If-Conditions |      7 // - If-Conditions | 
|      8  |         | 
|      9 val tmp = 0 |         | 
|     10 val result = !(tmp == 0) |         | 
|     11 val result = if (tmp == 0) true else false |         | 
|     12  |         | 
|     13 //        expressions (if (tmp == 0) true else false) |         | 
|     14 // - For-Comprehensions (guards, with/without yield) |      8 // - For-Comprehensions (guards, with/without yield) | 
|     15 // |         | 
|     16 // |         | 
|     17 // - Options |         | 
|     18 // - Higher-Order Functions (short-hand notation) |         | 
|     19 // - maps (behind for-comprehensions) |         | 
|     20 // - Pattern-Matching |         | 
|     21 // - String-Interpolations |      9 // - String-Interpolations | 
|         |     10 // | 
|         |     11 // | 
|         |     12  | 
|     22  |     13  | 
|     23 // Value assignments |     14 // Value assignments | 
|     24 // (their names should be lower case) |     15 // (their names should be lower case) | 
|     25 //==================================== |     16 //==================================== | 
|     26  |     17  | 
|     27  |     18  | 
|     28 val x = 42 |     19 val x = 42 | 
|     29 val y = 3 + 4  |     20 val y = 3 + 4  | 
|     30 val z = x / y |     21 val z = x / y | 
|     31 val x = 70 |     22 val x = 70 | 
|     32 print(z) |     23 println(z) | 
|     33  |     24  | 
|     34  |     25  | 
|     35 // (you cannot reassign values: z = 9 will give an error) |     26 // (you cannot reassign values: z = 9 will give an error) | 
|     36 //var z = 9 |     27 //var z = 9 | 
|     37 //z = 10 |     28 //z = 10 | 
|         |     29  | 
|     38  |     30  | 
|     39 // Hello World |     31 // Hello World | 
|     40 //============= |     32 //============= | 
|     41  |     33  | 
|     42 // an example of a stand-alone Scala file |     34 // an example of a stand-alone Scala file | 
|    243  |    235  | 
|    244 // The general scheme for a function: you have to give a  |    236 // The general scheme for a function: you have to give a  | 
|    245 // type to each argument and a return type of the function |    237 // type to each argument and a return type of the function | 
|    246 // |    238 // | 
|    247 //  def fname(arg1: ty1, arg2: ty2,..., argn: tyn): rty = { |    239 //  def fname(arg1: ty1, arg2: ty2,..., argn: tyn): rty = { | 
|    248 //     |    240 //     .... | 
|    249 //  } |    241 //  } | 
|    250  |    242  | 
|    251  |    243  | 
|    252  |    244  | 
|    253 // If-Conditionals |    245 // If-Conditionals | 
|    254 //================= |    246 //================= | 
|    255  |    247  | 
|    256 // - Scala does not have a then-keyword |    248 // - Scala used to not have a then-keyword | 
|    257 // - !!both if-else branches need to be present!! |    249 // - !!both if-else branches need to be present!! | 
|    258  |    250  | 
|    259 def fact(n: Int) : Int =  |    251 def fact(n: Int) : Int =  | 
|    260   if (n == 0) 1 else n * fact(n - 1) |    252   if (n == 0) 1 else n * fact(n - 1) | 
|         |    253  | 
|         |    254  | 
|         |    255 // Scala 3 introduced if-then-else - maybe people  | 
|         |    256 // desperately needed it  | 
|         |    257 def fact(n: Int) : Int =  | 
|         |    258   if n == 0 then 1 else n * fact(n - 1) | 
|    261  |    259  | 
|    262 fact(5) |    260 fact(5) | 
|    263 fact(150) |    261 fact(150) | 
|    264  |    262  | 
|    265 /* boolean operators |    263 /* boolean operators | 
|    375  |    371  | 
|    376 for (n <- (1 to 10).toList) println(n * n) |    372 for (n <- (1 to 10).toList) println(n * n) | 
|    377  |    373  | 
|    378 for (n <- (1 to 10).toList) yield n * n |    374 for (n <- (1 to 10).toList) yield n * n | 
|    379  |    375  | 
|         |    376  | 
|    380 // BTW: a roundabout way of printing out a list, say |    377 // BTW: a roundabout way of printing out a list, say | 
|    381 val lst = ('a' to 'm').toList |    378 val lst = ('a' to 'm').toList | 
|    382  |    379  | 
|    383 for (i <- (0 until lst.length)) println(lst(i)) |    380 for (i <- (0 until lst.length)) println(lst(i)) | 
|    384  |    381  | 
|    385 // Why not just? Why making your life so complicated? |    382 // ...why not just the following? Why making your life  | 
|         |    383 // so complicated? | 
|    386 for (c <- lst) println(c) |    384 for (c <- lst) println(c) | 
|    387  |    385  | 
|    388  |    386  | 
|    389  |    387  | 
|    390 // Functions producing multiple outputs |    388 // Functions producing multiple outputs | 
|    429   for (i <- (0 to n)) code |    427   for (i <- (0 to n)) code | 
|    430   val end = System.nanoTime() |    428   val end = System.nanoTime() | 
|    431   (end - start) / 1.0e9 |    429   (end - start) / 1.0e9 | 
|    432 } |    430 } | 
|    433  |    431  | 
|    434 val list = (1 to 1000000).toList |    432 val list = (1L to 10_000_000L).toList | 
|    435 time_needed(10, for (n <- list) yield n + 42) |    433 time_needed(10, for (n <- list) yield n + 42) | 
|    436 time_needed(10, for (n <- list.par) yield n + 42) |    434 time_needed(10, for (n <- list.par) yield n + 42) | 
|    437  |    435  | 
|    438 // ...but par does not make everything faster |    436 // ...but par does not make everything faster | 
|    439  |    437  | 
|    454 // But what the heck....lets try to count to 1 Mio in parallel |    452 // But what the heck....lets try to count to 1 Mio in parallel | 
|    455 import scala.collection.parallel.CollectionConverters._ |    453 import scala.collection.parallel.CollectionConverters._ | 
|    456  |    454  | 
|    457 var cnt = 0 |    455 var cnt = 0 | 
|    458  |    456  | 
|    459 for(i <- (1 to 1000000).par) cnt += 1 |    457 for(i <- (1 to 100_000).par) cnt += 1 | 
|    460  |    458  | 
|    461 println(s"Should be 1 Mio: $cnt") |    459 println(s"Should be 100000: $cnt") | 
|    462  |    460  | 
|    463  |    461  | 
|    464  |    462  | 
|    465 // Or |    463 // Or | 
|    466 // Q: Count how many elements are in the intersections of  |    464 // Q: Count how many elements are in the intersections of  | 
|    467 //    two sets? |    465 //    two sets? | 
|    468 // A; IMPROPER WAY (mutable counter) |    466 // A; IMPROPER WAY (mutable counter) | 
|    469  |    467  | 
|    470 def count_intersection(A: Set[Int], B: Set[Int]) : Int = { |    468 def count_intersection(A: Set[Int], B: Set[Int]) : Int = { | 
|    471   var count = 0 |    469   var count = 0 | 
|    472   for (x <- A.par; if (B contains x)) count += 1  |    470   for (x <- A.par; if B contains x) count += 1  | 
|    473   count |    471   count | 
|    474 } |    472 } | 
|    475  |    473  | 
|    476 val A = (0 to 999).toSet |    474 val A = (0 to 999).toSet | 
|    477 val B = (0 to 999 by 4).toSet |    475 val B = (0 to 999 by 4).toSet | 
|    486   A.par.count(x => B contains x) |    484   A.par.count(x => B contains x) | 
|    487  |    485  | 
|    488 count_intersection2(A, B) |    486 count_intersection2(A, B) | 
|    489  |    487  | 
|    490  |    488  | 
|    491 //another bad example |    489  | 
|    492 def test() = { |    490 // String Interpolations | 
|    493   var cnt = 0 |    491 //======================= | 
|    494   for(i <- (1 to 1000000).par) cnt += 1 |    492  | 
|    495   println(cnt) |    493 def cube(n: Int) : Int = n * n * n | 
|    496 } |    494  | 
|    497  |    495 val n = 3 | 
|    498 test() |    496 println("The cube of " + n + " is " + cube(n) + ".") | 
|    499  |    497  | 
|    500  |    498 println(s"The cube of $n is ${cube(n)}.") | 
|    501  |    499  | 
|    502 // Regular Expressions (the built in ones) |    500 // or even | 
|    503  |    501  | 
|    504 val s = """Any so-called "politician" should respect a vote.""" |    502 println(s"The cube of $n is ${n * n * n}.") | 
|    505 print(s) |    503  | 
|    506  |    504 // helpful for debugging purposes | 
|    507 print("""foo""") |    505 // | 
|    508  |    506 //     "The most effective debugging tool is still careful  | 
|    509 val reg = """\d+""".r |    507 //          thought, coupled with judiciously placed print  | 
|    510  |    508 //                                             statements." | 
|    511 reg.findAllIn("bbbbaaabbbaaaccc").toList |    509 //       — Brian W. Kernighan, in Unix for Beginners (1979) | 
|    512 reg.replaceAllIn("bbbbaaabbbaaaccc", "*") |    510  | 
|    513 reg.replaceAllIn("bbbb0aaa1bbba2aac3cc", "_") |    511  | 
|    514 reg.replaceAllIn("bbbb00aaa11bbba232aac33cc", "_") |    512  | 
|    515  |    513 def gcd_db(a: Int, b: Int) : Int = { | 
|         |    514   println(s"Function called with $a and $b.") | 
|         |    515   if (b == 0) a else gcd_db(b, a % b) | 
|         |    516 } | 
|         |    517  | 
|         |    518 gcd_db(48, 18) | 
|         |    519  | 
|         |    520 // you can also implement your own string interpolations | 
|         |    521  | 
|         |    522 extension (sc: StringContext) { | 
|         |    523     def i(args: Any*): String = s"\t${sc.s(args:_*)}\n" | 
|         |    524     def l(args: Any*): String = s"${sc.s(args:_*)}:\n" | 
|         |    525 } | 
|         |    526  | 
|         |    527 // this allows you to write things like | 
|         |    528  | 
|         |    529 i"add ${3+2}"  | 
|         |    530 l"some_fresh_name" | 
|    516  |    531  | 
|    517 // Further Information |    532 // Further Information | 
|    518 //===================== |    533 //===================== | 
|    519  |    534  | 
|         |    535 // We are going to use Scala 3 and the scala-cli repl (easier to use) | 
|         |    536 // | 
|         |    537 //  https://scala-cli.virtuslab.org | 
|         |    538 // | 
|         |    539 // | 
|    520 // The Scala homepage and general information is at |    540 // The Scala homepage and general information is at | 
|    521 // |    541 // | 
|    522 //  http://www.scala-lang.org |    542 //  http://www.scala-lang.org | 
|    523 //	http://docs.scala-lang.org |    543 //	http://docs.scala-lang.org | 
|    524 // |    544 // | 
|    525 // |    545 // | 
|    526 // It should be fairly easy to install the Scala binary and |    546 // It should be fairly easy to install the scala-cli binary and | 
|    527 // run Scala on the commandline. People also use Scala with  |    547 // run Scala on the commandline. People also use Scala with  | 
|    528 // Vim and Jedit. I currently settled on VS Code |    548 // Vim and Jedit. I currently settled on Codium | 
|    529 // |    549 // | 
|    530 //   https://code.visualstudio.com |    550 //   https://code.visualstudio.com | 
|    531 // |    551 // | 
|    532 // There are also plugins for Eclipse and IntelliJ - YMMV. |    552 // There are also plugins for Eclipse and IntelliJ - YMMV. | 
|    533 // Finally there are online editors specifically designed for  |    553 // Finally there are online editors specifically designed for  | 
|    540 // |    560 // | 
|    541 // |    561 // | 
|    542 // Scala Library Docs |    562 // Scala Library Docs | 
|    543 //==================== |    563 //==================== | 
|    544 // |    564 // | 
|    545 //  http://www.scala-lang.org/api/current/ |    565 //  https://dotty.epfl.ch/api/index.html | 
|    546 // |    566 // | 
|    547 // Scala Tutorials |    567 // Scala Tutorials | 
|    548 // |    568 // | 
|    549 //  http://docs.scala-lang.org/tutorials/ |    569 //  http://docs.scala-lang.org/tutorials/ | 
|    550 // |    570 // | 
|    551 // There are also a massive number of Scala tutorials on youtube |    571 // There are also a massive number of Scala tutorials on youtube | 
|    552 // and there are tons of books and free material. Google is your  |    572 // and there are tons of books and free material. Google is your  | 
|    553 // friend. |    573 // friend. Just make sure you follow newer material about Scala 3. | 
|    554  |    574  | 
|    555  |    575  |