diff --git a/.gitignore b/.gitignore index 79513827c..c666f4521 100644 --- a/.gitignore +++ b/.gitignore @@ -16,16 +16,19 @@ tmp **/*.toc **/*.fdb_latexmk **/*.fls +**/*.dvi # Java / Scala **/*.class **/.bloop **/.metals -**/project/metals.sbt +**/metals.sbt **/.bsp **/.scalafmt.conf **/.ammonite workspace/**/.vscode +about/**/.vscode +**/.scala-build/ # Eclipse **/*.cache-main diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d87630b36..000000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: required -dist: trusty - -language: scala -scala: 2.13.3 - -jdk: - - openjdk11 - -git: - depth: 3 - -before_install: - - sudo apt-get update -q - - sudo apt-get install texlive-full texlive-latex-extra texlive-lang-all texlive-lang-swedish -y - -script: - - sbt pdfCompendium diff --git a/README.md b/README.md index c8b231cb1..c63c45271 100644 --- a/README.md +++ b/README.md @@ -3,29 +3,30 @@ ![Build Status](https://github.com/lunduniversity/introprog/actions/workflows/main.yml/badge.svg) -This is the repo of a course given by Lund University called "Introduction to Programming" using Scala and Java. The repo contains course material in Swedish and some English along with code examples and libraries used in exercises and labs. +This is the repo of a course given by Lund University called "Introduction to Programming" using Scala. The repo contains course material in Swedish and some English along with code examples and libraries used in exercises and labs. Course homepage (in Swedish): http://cs.lth.se/pgk/ -This is on-going work, and the first instance of the course was given in 2016 at Lund University. A new instance of the course is given each fall semester. +This is on-going work, and the first instance of the course was given in 2016 at Lund University. A new instance of the course is given each fall semester. In 2021 the course migrated to Scala 3. ## How to use this repo -* Download a stable, but possibly old, released version of the course material on the [release page](https://github.com/lunduniversity/introprog/releases) +* Download latest stable version of the on-line course material from the [course homepage at Lund University](https://cs.lth.se/pgk/download/) -* Download the current course material from the [course homepage at Lund University](http://cs.lth.se/pgk/litteratur/) +* Use a cached version or re-compile the latest snapshot version, possibly in an inconsistent state under update, of the most recent version of the course material via LaTeX.Online (if your click triggers a re-compile it may take a while before the pdf is ready; if the server is not responding then try again later): -* Download the very latest snapshot version, possibly in an inconsistent state under update, of the most recent build of the course material via LaTeX.Online: + - [compendium1.pdf](https://latexonline.cc/compile?git=https://github.com/lunduniversity/introprog&target=compendium/compendium1.tex&command=pdflatex) with lectures and assignments for the first half of the course, formatted for print. - - [compendium1.pdf](https://latexonline.cc/compile?git=https://github.com/lunduniversity/introprog&target=compendium/compendium1.tex&command=pdflatex) with lectures and assigmnets for the first half of the course, formatted for print + - [compendium2.pdf](https://latexonline.cc/compile?git=https://github.com/lunduniversity/introprog&target=compendium/compendium2.tex&command=pdflatex) with lectures and assignments for the second half of the course, formatted for print. - - [compendium2.pdf](https://latexonline.cc/compile?git=https://github.com/lunduniversity/introprog&target=compendium/compendium2.tex&command=pdflatex) with lectures and assigmnets for the second half of the course, formatted for print + - [compendium.pdf](https://latexonline.cc/compile?git=https://github.com/lunduniversity/introprog&target=compendium/compendium.tex&command=pdflatex) with both parts above in one pdf formatted for easy screen readability and Ctrl+F search. - - [compendium.pdf](https://latexonline.cc/compile?git=https://github.com/lunduniversity/introprog&target=compendium/compendium.tex&command=pdflatex) with both parts above in one pdf formatted for easy screen readability + - Thanks to [LaTeX.Online](https://latexonline.cc) for their amazing cloud service! - - Thanks to [LaTeX.Online](https://latexonline.cc) for their cloud service! +* Build it locally using `sbt build` as explained in "How to build" below. + +* Download a stable, but possibly old, released version course material on the [release page](https://github.com/lunduniversity/introprog/releases) frozen at time of printing. The release page is updated at least before the start of each course instance in August each year. -* Download the [workspace](https://github.com/lunduniversity/introprog/blob/master/lib/workspace.zip) to be used with your favorite code editor and IDE. See instructions in appendices in `compendium.pdf` above. ## Contents of this repo @@ -40,36 +41,20 @@ The main directories are: * `refs` extra readings, background material * `teachers` information for teachers -## How to build this repo - -### With sbt - -If you like to use the [scala build tool, sbt](http://www.scala-sbt.org) it is easy to build everything in this repo: - -* Install sbt: http://www.scala-sbt.org/release/docs/Setup.html +## How to build -* Download this repo: https://github.com/lunduniversity/introprog/archive/master.zip (or make a fork and then a clone as explained [below](https://github.com/lunduniversity/introprog#how-to-contribute-to-this-repo)) +* Install sbt: https://www.scala-sbt.org/download.html -* Unpack the zip in some suitable directory named introprog. +* Download and unpack this repo: https://github.com/lunduniversity/introprog/archive/master.zip or make a fork and then a clone as explained [below](https://github.com/lunduniversity/introprog#how-to-contribute-to-this-repo) * run these sbt commands in a terminal window in the introprog directory: * `sbt compile` to compile all sources - * `sbt eclipse` to make eclipse project files * `sbt gen` to generate the planning files, alias for `sbt plan/run` * `sbt pdf` to make slides and compendium using pdflatex * `sbt build` run both the commands `gen` and `pdf` in sequence -### Without sbt - -* **Workspace** You can import the different sub projects in the `workspace` directory into your favorite IDE, e.g. Eclipse or IntelliJ, and build them there after importing each of them from within the IDE. - -* **Plan** You can compile and run the Main.scala object in the `plan` directory using the command `scala Main` in terminal after you have manually compiled all `.scala` files. - -* **Latex** You can build the `.tex` files to `.pdf` with `pdflatex` in terminal or using your favourite Latex editor, e.g. texworks. - - -## How to contribute to this repo +## How to contribute ### Fork and clone @@ -169,13 +154,11 @@ Here are some other inspiring style guides that illustrate the variety in what d # License -Copyright © 2015-2018. Dept. of Computer Science at Lund University, Lund, Sweden. - -Contributors: https://github.com/lunduniversity/introprog/blob/master/contributors.tex +This work is licensed under the [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). -This work is licensed under a -Creative Commons Attribution-ShareAlike 4.0 International License. +Copyright © 2015-2022 [Bjorn Regnell](https://github.com/bjornregnell) +Contributors: https://github.com/lunduniversity/introprog/blob/master/contributors.tex You are free to: @@ -187,7 +170,4 @@ Under the following terms: * Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. * ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. -* No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. - - -See http://creativecommons.org/licenses/by-sa/4.0/ +* No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. \ No newline at end of file diff --git a/about/course-experience-first-year/course-experiences.pdf b/about/course-experience-first-year/course-experiences.pdf index 86c855453..9682ce24d 100644 Binary files a/about/course-experience-first-year/course-experiences.pdf and b/about/course-experience-first-year/course-experiences.pdf differ diff --git a/about/course-experience-first-year/course-experiences.tex b/about/course-experience-first-year/course-experiences.tex index 54c7085ad..a119903f9 100644 --- a/about/course-experience-first-year/course-experiences.tex +++ b/about/course-experience-first-year/course-experiences.tex @@ -12,7 +12,8 @@ \usepackage{tikz} \usepackage{pgfplots} -\pgfplotsset{compat=newest} +%&\pgfplotsset{compat=newest} +\pgfplotsset{compat=1.14} \usepackage{pgfplotstable} \usepackage{filecontents} diff --git a/about/info-ekosystemteknik/slides.scala b/about/info-ekosystemteknik/slides.scala new file mode 100644 index 000000000..4acd4371e --- /dev/null +++ b/about/info-ekosystemteknik/slides.scala @@ -0,0 +1,29 @@ +//> using lib "taggy:taggy:0.0.1,url=https://github.com/bjornregnell/taggy/releases/download/v0.0.1/taggy_3-0.0.1.jar" +//> using scala "3.nightly" + +// run in terminal> scala-cli run . +// you can get scala-cli from here: https://scala-cli.virtuslab.org/install +// after running the slides are generated in target/out.pdf + +import scala.language.experimental.fewerBraces +import taggy.* + +@main def run = slides.toPdf() + +def slides = document("Informationsmöte om programmering för Ekosystemteknik"): + frame("Två alternativa programmeringskurser för W"): + p("**EDAA65** Programmering: 6 hp, lp3-4") + itemize: + p("Allmänbildning för ''icke-IT-program'', obl. f. M") + p("Språk: **Java**") + p("https://cs.lth.se/edaa65/") + p("**EDAA45** Programmering, grundkurs: 7.5 hp, lp1-2") + itemize: + p("Konceptuell grund för vidare studier, obl. f. D+C") + //p("Lämplig för de med extra intresse och hög ambition") + p("Språk: **Scala**") + p("""Läses med fördel tillsammans med \\ + EDAA60 Datorer och datoranvändning ''dod'', 3hp \\ + som ger kunskap om linux och terminalkommando""") + p("https://cs.lth.se/pgk") + p("*Valfri fortsättning:* **EDAA01** Programmering fördjupningskurs") \ No newline at end of file diff --git a/build.sbt b/build.sbt index dea1ebce5..b7ddb3b1e 100644 --- a/build.sbt +++ b/build.sbt @@ -39,7 +39,7 @@ lazy val myStartupTransition: State => State = { s: State => lazy val commonSettings = Seq( organization := "se.lth.cs", version := "2021.0.1", - scalaVersion := "3.1.0", + scalaVersion := "3.1.2", scalacOptions ++= Seq("-deprecation", "-feature") ) @@ -84,6 +84,13 @@ gengloss := (glossary/Compile/run).toTask("").value // ************** cmd util functions +def showTail(fileName: String, n: Int = 40): Unit = { + // this method was created as tail does not work on windows + println(s"--- Last $n lines of $fileName: ") + val lines = sbt.io.IO.readLines(new java.io.File(fileName)) + println(lines.takeRight(n).mkString("\n")) +} + def runPdfLatexCmd(texFile: File, workDir: File, stdOutSuffix: String = "-console.log"): Unit = { println(s" ******* Compiling $texFile to pdf *******") val cmd = scala.sys.process.Process( @@ -99,7 +106,8 @@ def runPdfLatexCmd(texFile: File, workDir: File, stdOutSuffix: String = "-consol if (exitValue != 0) { println("*** ############ ERROR LOG STARTS HERE ############### ***") //Process(Seq("cat", cmdOutputFile.getName), workDir).run - scala.sys.process.Process(Seq("tail", "-40", cmdOutputFile.getName), workDir).run + //scala.sys.process.Process(Seq("tail", "-40", cmdOutputFile.getName), workDir).run + showTail(s"$cmdOutputFile") sys.error(s"\n*** ERROR: pdflatex exit code: $exitValue\nSee COMPLETE pdflatex output in: $cmdOutputFile") } else println(s" Log file: $cmdOutputFile") } diff --git a/compendium/compendium.cls b/compendium/compendium.cls index 97265df6d..49f53728a 100644 --- a/compendium/compendium.cls +++ b/compendium/compendium.cls @@ -341,11 +341,11 @@ basicstyle=\ttfamily\fontsize{10}{12}\selectfont,% language=Scala,#1]{#3}} \lstnewenvironment{Code}[1][]{% - \lstset{#1}% + \lstset{language=Scala,#1}% }{} \lstnewenvironment{CodeSmall}[1][]{% - \lstset{basicstyle=\ttfamily\fontsize{10}{12}\selectfont,#1}% + \lstset{language=Scala,basicstyle=\ttfamily\fontsize{10}{12}\selectfont,#1}% }{} \lstnewenvironment{REPL}[1][]{% diff --git a/compendium/compendium.tex b/compendium/compendium.tex index 601948655..157484d28 100644 --- a/compendium/compendium.tex +++ b/compendium/compendium.tex @@ -160,7 +160,7 @@ \part{Moduler} \input{modules/w12-extra-chapter.tex} \input{modules/w12-extra-exercise.tex} \input{modules/w12-assignment-bank.tex} -\input{modules/w12-assignment-tabular.tex} +%\input{modules/w12-assignment-tabular.tex} \input{modules/w12-assignment-music.tex} \input{modules/w12-assignment-photo.tex} diff --git a/compendium/compendium2.tex b/compendium/compendium2.tex index f76ed0618..6e06c56b9 100644 --- a/compendium/compendium2.tex +++ b/compendium/compendium2.tex @@ -157,7 +157,7 @@ \part{Moduler} %\input{generated/w12-chaphead-generated.tex} \input{modules/w12-extra-exercise.tex} \input{modules/w12-assignment-bank.tex} -\input{modules/w12-assignment-tabular.tex} +%\input{modules/w12-assignment-tabular.tex} \input{modules/w12-assignment-music.tex} \input{modules/w12-assignment-photo.tex} diff --git a/compendium/cover/cover-A3-part1.tex b/compendium/cover/cover-A3-part1.tex index 4b7d5485f..68bc8a4c6 100644 --- a/compendium/cover/cover-A3-part1.tex +++ b/compendium/cover/cover-A3-part1.tex @@ -26,7 +26,7 @@ \usepackage{tikz} \usetikzlibrary{calc} -\definecolor{Background}{HTML}{AA0066}%{FC6B03}%{A10618}% +\definecolor{Background}{HTML}{531161}%{AA0066}%{FC6B03}%{A10618}%2C001E % lila90% {HTML}{411934} orange E95420 lila 2C001E D-rosa: F280A1 % red: {rgb}{0.7,0.07,0.12} vivid red: {HTML}{C90018} \definecolor{Foreground}{HTML}{FFFFFF} % 000000 FFFFFF diff --git a/compendium/cover/cover-A3-part2.tex b/compendium/cover/cover-A3-part2.tex index f37aec723..bd52bd87f 100644 --- a/compendium/cover/cover-A3-part2.tex +++ b/compendium/cover/cover-A3-part2.tex @@ -29,7 +29,7 @@ %\definecolor{Background}{HTML}{8F2429} %\definecolor{Background}{HTML}{0B5229} -\definecolor{Background}{HTML}{228811}%{120078} +\definecolor{Background}{HTML}{BE4067}%{228811}%{120078} % lila90% {HTML}{411934} orange E95420 lila 2C001E D-rosa: F280A1 % red: {rgb}{0.7,0.07,0.12} vivid red: {HTML}{C90018} \definecolor{Foreground}{HTML}{FFFFFF} % 000000 FFFFFF diff --git a/compendium/cover/cover-body.tex b/compendium/cover/cover-body.tex index bccdfd823..fbef48d65 100644 --- a/compendium/cover/cover-body.tex +++ b/compendium/cover/cover-body.tex @@ -78,10 +78,10 @@ \node[above right, text width=15.3cm,align=left] (collection-traits) at ($(current page.west)+(\LeftMarginBack,3.8)+(1.0,\YPosBack)$) { \begin{minipage}{1.0\textwidth}\sffamily\large -Detta kompendium är kurslitteratur i \textit{''Programmering, grundkurs''} på \textbf{Lunds tekniska högskola} vid Lunds universitet. Kursen omfattar 7,5 högskolepoäng och är obligatorisk i årskurs 1 för civilingenjörsprogrammen i Datateknik (D) och Infocom (C). Kursen ges även som valfri för andra utbildningsprogram och som fristående kurs. +Detta kompendium är kurslitteratur i \textit{''Programmering, grundkurs''} på \textbf{Lunds tekniska högskola} vid Lunds universitet. Kursen omfattar 7,5 högskolepoäng och är obligatorisk i årskurs 1 för civilingenjörsprogrammen i Datateknik (D) och Infocom (C). %Kursen ges även som valfri för andra utbildningsprogram och som fristående kurs. \vspace{1em} -Kursen omfattar grundläggande programmeringsprinciper och viktiga datavetenskapliga begrepp. Du lär dig det moderna och kraftfulla programmeringsspråket \textbf{Scala}, att konstruera algoritmer, att använda datastrukturer och mycket annat. Det krävs inga förkunskaper i programmering. Kursen syftar till att ge en solid \textbf{grund för fortsatta studier} i programmering och systemutveckling. +Kursen omfattar grundläggande programmeringsprinciper och viktiga datavetenskapliga begrepp. Du lär dig det moderna och kraftfulla programmeringsspråket \textbf{Scala}, att konstruera algoritmer, att använda datastrukturer och mycket annat. Det krävs inga förkunskaper i programmering. Kursen syftar till att ge en solid \textbf{grund för fortsatta studier} i programmering och avancerad systemutveckling. %Du använder det moderna och kraftfulla programmeringsspråket \textbf{Scala} för att lära dig grunderna i programmering. diff --git a/compendium/examples/scalajava/Point.scala b/compendium/examples/scalajava/Point.scala index 72dde456f..be5511fba 100644 --- a/compendium/examples/scalajava/Point.scala +++ b/compendium/examples/scalajava/Point.scala @@ -1,5 +1,5 @@ class Point(val x: Int, val y: Int, save: Boolean = false): - import Point._ + import Point.* if save then saved.prepend(this) diff --git a/compendium/examples/sequences/build.sbt b/compendium/examples/sequences/build.sbt index 085cbd92c..c8562c8e7 100644 --- a/compendium/examples/sequences/build.sbt +++ b/compendium/examples/sequences/build.sbt @@ -1,2 +1,2 @@ -scalaVersion := "3.0.1" +scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.2.0" diff --git a/compendium/examples/sequences/project/build.properties b/compendium/examples/sequences/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/compendium/examples/sequences/project/build.properties +++ b/compendium/examples/sequences/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/compendium/examples/workspace/w05-seqalg/build.sbt b/compendium/examples/workspace/w05-seqalg/build.sbt index e9afdd39b..fde1a208b 100644 --- a/compendium/examples/workspace/w05-seqalg/build.sbt +++ b/compendium/examples/workspace/w05-seqalg/build.sbt @@ -1,3 +1,3 @@ -scalaVersion := "3.0.1" +scalaVersion := "3.1.2" Compile/scalaSource := baseDirectory.value / "src" unmanagedBase := baseDirectory.value / "../../../../lib/" diff --git a/compendium/examples/workspace/w05-seqalg/project/build.properties b/compendium/examples/workspace/w05-seqalg/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/compendium/examples/workspace/w05-seqalg/project/build.properties +++ b/compendium/examples/workspace/w05-seqalg/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/compendium/examples/workspace/w07-inherit/build.sbt b/compendium/examples/workspace/w07-inherit/build.sbt index 095920e9c..939b5cb19 100644 --- a/compendium/examples/workspace/w07-inherit/build.sbt +++ b/compendium/examples/workspace/w07-inherit/build.sbt @@ -1,4 +1,4 @@ -scalaVersion := "3.0.1" +scalaVersion := "3.1.2" Compile/scalaSource := baseDirectory.value / "src" //unmanagedBase := baseDirectory.value / "../../../../lib/" //old cslib libraryDependencies += "se.lth.cs" %% "introprog" % "1.2.0" diff --git a/compendium/examples/workspace/w07-inherit/project/build.properties b/compendium/examples/workspace/w07-inherit/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/compendium/examples/workspace/w07-inherit/project/build.properties +++ b/compendium/examples/workspace/w07-inherit/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/compendium/examples/workspace/w07-inherit/src/shapesTest1.scala b/compendium/examples/workspace/w07-inherit/src/shapesTest1.scala index 07de8a3df..8e567d43f 100644 --- a/compendium/examples/workspace/w07-inherit/src/shapesTest1.scala +++ b/compendium/examples/workspace/w07-inherit/src/shapesTest1.scala @@ -1,4 +1,4 @@ -import shapes1._ +import shapes1.* object shapesTest1: def main(args: Array[String]): Unit = diff --git a/compendium/examples/workspace/w07-inherit/src/shapesTest2.scala b/compendium/examples/workspace/w07-inherit/src/shapesTest2.scala index 2c1313dff..081d9fd6c 100644 --- a/compendium/examples/workspace/w07-inherit/src/shapesTest2.scala +++ b/compendium/examples/workspace/w07-inherit/src/shapesTest2.scala @@ -1,4 +1,4 @@ -import shapes2._ +import shapes2.* object shapesTest2: def main(args: Array[String]): Unit = diff --git a/compendium/examples/workspace/w07-inherit/src/vego1.scala b/compendium/examples/workspace/w07-inherit/src/vego1.scala index 90112a546..8afad1b7e 100644 --- a/compendium/examples/workspace/w07-inherit/src/vego1.scala +++ b/compendium/examples/workspace/w07-inherit/src/vego1.scala @@ -7,14 +7,14 @@ object exempelVego1: def skala(): Unit // abstrakt medlem, saknar implementation class Gurka(var vikt: Double) extends Grönsak: - def skala(): Unit = // implementation av skala() specifik för Gurka + def skala(): Unit = // implementation specifik för Gurka if !ärSkalad then println("Skalas med skalare.") vikt = 0.99 * vikt ärSkalad = true class Tomat(var vikt: Double) extends Grönsak: - def skala(): Unit = // implementation av skala() specifik för Tomat + def skala(): Unit = // implementation specifik för Tomat if !ärSkalad then println("Skållas.") vikt = 0.99 * vikt diff --git a/compendium/examples/workspace/w07-inherit/src/vego1Test.scala b/compendium/examples/workspace/w07-inherit/src/vego1Test.scala index 0671d329d..1f8151719 100644 --- a/compendium/examples/workspace/w07-inherit/src/vego1Test.scala +++ b/compendium/examples/workspace/w07-inherit/src/vego1Test.scala @@ -1,4 +1,4 @@ -import exempelVego1._ +import exempelVego1.* object vego1Test: def main(args: Array[String]): Unit = diff --git a/compendium/examples/workspace/w07-inherit/src/vego2.scala b/compendium/examples/workspace/w07-inherit/src/vego2.scala index 455ec6b15..22a659ceb 100644 --- a/compendium/examples/workspace/w07-inherit/src/vego2.scala +++ b/compendium/examples/workspace/w07-inherit/src/vego2.scala @@ -1,6 +1,6 @@ object exempelVego2: - trait Grönsak: // innehåller alla gemensamma delar; hjälper oss undvika upprepning + trait Grönsak: // innehåller gemensamma delar; hjälper oss undvika upprepning val skalningsmetod: String // abstrakt val skalfaktor = 0.99 // konkret var vikt: Double // abstrakt @@ -11,8 +11,8 @@ object exempelVego2: vikt = skalfaktor * vikt ärSkalad = true - class Gurka(var vikt: Double) extends Grönsak: // bara det som är speciellt för gurkor + class Gurka(var vikt: Double) extends Grönsak: // det som är speciellt för gurkor val skalningsmetod = "Skalas med skalare." - class Tomat(var vikt: Double) extends Grönsak: // bara det som är speciellt för tomater + class Tomat(var vikt: Double) extends Grönsak: // det som är speciellt för tomater val skalningsmetod = "Skållas." diff --git a/compendium/examples/workspace/w07-inherit/src/vego2Test.scala b/compendium/examples/workspace/w07-inherit/src/vego2Test.scala index d2e9c24eb..abfbbd5b2 100644 --- a/compendium/examples/workspace/w07-inherit/src/vego2Test.scala +++ b/compendium/examples/workspace/w07-inherit/src/vego2Test.scala @@ -1,4 +1,4 @@ -import exempelVego2._ +import exempelVego2.* object vego2Test: def main(args: Array[String]): Unit = diff --git a/compendium/generated/names-generated.tex b/compendium/generated/names-generated.tex index ee2dfa055..25001c599 100644 --- a/compendium/generated/names-generated.tex +++ b/compendium/generated/names-generated.tex @@ -5,52 +5,52 @@ \newcommand{\LabWeekONE}{kojo} -\newcommand{\ModWeekTWO}{Program, kontrollstrukturer} +\newcommand{\ModWeekTWO}{Program och kontrollstrukturer} \newcommand{\ExeWeekTWO}{programs} \newcommand{\LabWeekTWO}{--} -\newcommand{\ModWeekTHREE}{Funktioner, abstraktion} +\newcommand{\ModWeekTHREE}{Funktioner och abstraktion} \newcommand{\ExeWeekTHREE}{functions} \newcommand{\LabWeekTHREE}{irritext} -\newcommand{\ModWeekFOUR}{Objekt, inkapsling} +\newcommand{\ModWeekFOUR}{Objekt och inkapsling} \newcommand{\ExeWeekFOUR}{objects} \newcommand{\LabWeekFOUR}{blockmole} -\newcommand{\ModWeekFIVE}{Klasser, datamodellering} +\newcommand{\ModWeekFIVE}{Klasser och datamodellering} \newcommand{\ExeWeekFIVE}{classes} \newcommand{\LabWeekFIVE}{--} -\newcommand{\ModWeekSIX}{Mönster, felhantering} +\newcommand{\ModWeekSIX}{Mönster och felhantering} \newcommand{\ExeWeekSIX}{patterns} \newcommand{\LabWeekSIX}{blockbattle} -\newcommand{\ModWeekSEVEN}{Sekvenser, enumerationer} +\newcommand{\ModWeekSEVEN}{Sekvenser och enumerationer} \newcommand{\ExeWeekSEVEN}{sequences} \newcommand{\LabWeekSEVEN}{shuffle} -\newcommand{\ModWeekEIGHT}{Matriser, typparametrar} +\newcommand{\ModWeekEIGHT}{Nästlade och generiska strukturer} \newcommand{\ExeWeekEIGHT}{matrices} \newcommand{\LabWeekEIGHT}{life} -\newcommand{\ModWeekNINE}{Mängder, tabeller} +\newcommand{\ModWeekNINE}{Mängder och tabeller} \newcommand{\ExeWeekNINE}{lookup} \newcommand{\LabWeekNINE}{words} -\newcommand{\ModWeekTEN}{Arv, komposition} +\newcommand{\ModWeekTEN}{Arv och komposition} \newcommand{\ExeWeekTEN}{inheritance} \newcommand{\LabWeekTEN}{snake0} -\newcommand{\ModWeekELEVEN}{Kontextparametrar, api} +\newcommand{\ModWeekELEVEN}{Kontextuella abstraktioner och varians} \newcommand{\ExeWeekELEVEN}{context} \newcommand{\LabWeekELEVEN}{snake1} @@ -65,6 +65,6 @@ \newcommand{\LabWeekTHIRTEEN}{Projekt1} -\newcommand{\ModWeekFOURTEEN}{Muntligt prov} +\newcommand{\ModWeekFOURTEEN}{MUNTLIGT PROV} \newcommand{\ExeWeekFOURTEEN}{Munta} \newcommand{\LabWeekFOURTEEN}{Munta} diff --git a/compendium/generated/quiz-w04-concepts-solurows-generated.tex b/compendium/generated/quiz-w04-concepts-solurows-generated.tex index 292c9e396..15627d7b0 100644 --- a/compendium/generated/quiz-w04-concepts-solurows-generated.tex +++ b/compendium/generated/quiz-w04-concepts-solurows-generated.tex @@ -1,15 +1,16 @@ - modul & 1 & ~~\Large$\leadsto$~~ & M & kodenhet med abstraktioner som kan återanvändas \\ - singelobjekt & 2 & ~~\Large$\leadsto$~~ & A & modul som kan ha tillstånd; finns i en enda upplaga \\ - paket & 3 & ~~\Large$\leadsto$~~ & H & modul som skapar namnrymd; maskinkod får egen katalog \\ - import & 4 & ~~\Large$\leadsto$~~ & K & gör namn tillgängligt utan att hela sökvägen behövs \\ - lat initialisering & 5 & ~~\Large$\leadsto$~~ & G & allokering sker först när namnet refereras \\ - medlem & 6 & ~~\Large$\leadsto$~~ & B & tillhör ett objekt; nås med punktnotation om synlig \\ - attribut & 7 & ~~\Large$\leadsto$~~ & J & variabel som utgör (del av) ett objekts tillstånd \\ - metod & 8 & ~~\Large$\leadsto$~~ & F & funktion som är medlem av ett objekt \\ - privat & 9 & ~~\Large$\leadsto$~~ & C & modifierar synligheten av en objektmedlem \\ - överlagring & 10 & ~~\Large$\leadsto$~~ & N & metoder med samma namn men olika parametertyper \\ - namnskuggning & 11 & ~~\Large$\leadsto$~~ & O & lokalt namn döljer samma namn i omgivande block \\ - namnrymd & 12 & ~~\Large$\leadsto$~~ & I & omgivning där är alla namn är unika \\ - uniform access & 13 & ~~\Large$\leadsto$~~ & E & ändring mellan def och val påverkar ej användning \\ - punktnotation & 14 & ~~\Large$\leadsto$~~ & D & används för att komma åt icke-privata delar \\ - typalias & 15 & ~~\Large$\leadsto$~~ & L & alternativt namn på typ som ofta ökar läsbarheten \\ \ No newline at end of file + modul & 1 & ~~\Large$\leadsto$~~ & C & kodenhet med abstraktioner som kan återanvändas \\ + singelobjekt & 2 & ~~\Large$\leadsto$~~ & B & modul som kan ha tillstånd; finns i en enda upplaga \\ + paket & 3 & ~~\Large$\leadsto$~~ & D & modul som skapar namnrymd; maskinkod får egen katalog \\ + import & 4 & ~~\Large$\leadsto$~~ & F & gör namn tillgängligt lokalt utan att hela sökvägen behövs \\ + export & 5 & ~~\Large$\leadsto$~~ & P & gör namn synligt utåt som medlem i detta objekt \\ + lat initialisering & 6 & ~~\Large$\leadsto$~~ & G & allokering sker först när namnet refereras \\ + medlem & 7 & ~~\Large$\leadsto$~~ & E & tillhör ett objekt; nås med punktnotation om synlig \\ + attribut & 8 & ~~\Large$\leadsto$~~ & H & variabel som utgör (del av) ett objekts tillstånd \\ + metod & 9 & ~~\Large$\leadsto$~~ & A & funktion som är medlem av ett objekt \\ + privat & 10 & ~~\Large$\leadsto$~~ & K & modifierar synligheten av en objektmedlem \\ + överlagring & 11 & ~~\Large$\leadsto$~~ & J & metoder med samma namn men olika parametertyper \\ + namnskuggning & 12 & ~~\Large$\leadsto$~~ & L & lokalt namn döljer samma namn i omgivande block \\ + namnrymd & 13 & ~~\Large$\leadsto$~~ & I & omgivning där är alla namn är unika \\ + uniform access & 14 & ~~\Large$\leadsto$~~ & M & ändring mellan def och val påverkar ej användning \\ + punktnotation & 15 & ~~\Large$\leadsto$~~ & O & används för att komma åt icke-privata delar \\ + typalias & 16 & ~~\Large$\leadsto$~~ & N & alternativt namn på typ som ofta ökar läsbarheten \\ \ No newline at end of file diff --git a/compendium/generated/quiz-w04-concepts-taskrows-generated.tex b/compendium/generated/quiz-w04-concepts-taskrows-generated.tex index 8b34bf584..dc361d80f 100644 --- a/compendium/generated/quiz-w04-concepts-taskrows-generated.tex +++ b/compendium/generated/quiz-w04-concepts-taskrows-generated.tex @@ -1,15 +1,16 @@ - modul & 1 & & A & modul som kan ha tillstånd; finns i en enda upplaga \\ - singelobjekt & 2 & & B & tillhör ett objekt; nås med punktnotation om synlig \\ - paket & 3 & & C & modifierar synligheten av en objektmedlem \\ - import & 4 & & D & används för att komma åt icke-privata delar \\ - lat initialisering & 5 & & E & ändring mellan def och val påverkar ej användning \\ - medlem & 6 & & F & funktion som är medlem av ett objekt \\ - attribut & 7 & & G & allokering sker först när namnet refereras \\ - metod & 8 & & H & modul som skapar namnrymd; maskinkod får egen katalog \\ - privat & 9 & & I & omgivning där är alla namn är unika \\ - överlagring & 10 & & J & variabel som utgör (del av) ett objekts tillstånd \\ - namnskuggning & 11 & & K & gör namn tillgängligt utan att hela sökvägen behövs \\ - namnrymd & 12 & & L & alternativt namn på typ som ofta ökar läsbarheten \\ - uniform access & 13 & & M & kodenhet med abstraktioner som kan återanvändas \\ - punktnotation & 14 & & N & metoder med samma namn men olika parametertyper \\ - typalias & 15 & & O & lokalt namn döljer samma namn i omgivande block \\ \ No newline at end of file + modul & 1 & & A & funktion som är medlem av ett objekt \\ + singelobjekt & 2 & & B & modul som kan ha tillstånd; finns i en enda upplaga \\ + paket & 3 & & C & kodenhet med abstraktioner som kan återanvändas \\ + import & 4 & & D & modul som skapar namnrymd; maskinkod får egen katalog \\ + export & 5 & & E & tillhör ett objekt; nås med punktnotation om synlig \\ + lat initialisering & 6 & & F & gör namn tillgängligt lokalt utan att hela sökvägen behövs \\ + medlem & 7 & & G & allokering sker först när namnet refereras \\ + attribut & 8 & & H & variabel som utgör (del av) ett objekts tillstånd \\ + metod & 9 & & I & omgivning där är alla namn är unika \\ + privat & 10 & & J & metoder med samma namn men olika parametertyper \\ + överlagring & 11 & & K & modifierar synligheten av en objektmedlem \\ + namnskuggning & 12 & & L & lokalt namn döljer samma namn i omgivande block \\ + namnrymd & 13 & & M & ändring mellan def och val påverkar ej användning \\ + uniform access & 14 & & N & alternativt namn på typ som ofta ökar läsbarheten \\ + punktnotation & 15 & & O & används för att komma åt icke-privata delar \\ + typalias & 16 & & P & gör namn synligt utåt som medlem i detta objekt \\ \ No newline at end of file diff --git a/compendium/generated/w02-chaphead-generated.tex b/compendium/generated/w02-chaphead-generated.tex index 8d87f7214..771272096 100644 --- a/compendium/generated/w02-chaphead-generated.tex +++ b/compendium/generated/w02-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Program, kontrollstrukturer}\label{chapter:W02} +\chapter{Program och kontrollstrukturer}\label{chapter:W02} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item huvudprogram diff --git a/compendium/generated/w03-chaphead-generated.tex b/compendium/generated/w03-chaphead-generated.tex index 63f108059..26fd79d5e 100644 --- a/compendium/generated/w03-chaphead-generated.tex +++ b/compendium/generated/w03-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Funktioner, abstraktion}\label{chapter:W03} +\chapter{Funktioner och abstraktion}\label{chapter:W03} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item abstraktion diff --git a/compendium/generated/w04-chaphead-generated.tex b/compendium/generated/w04-chaphead-generated.tex index 80ef069a2..451e92de6 100644 --- a/compendium/generated/w04-chaphead-generated.tex +++ b/compendium/generated/w04-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Objekt, inkapsling}\label{chapter:W04} +\chapter{Objekt och inkapsling}\label{chapter:W04} Begrepp som ingår i denna veckas studier: \begin{multicols}{2}\begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item modul @@ -17,6 +17,7 @@ \chapter{Objekt, inkapsling}\label{chapter:W04} \item import \item selektiv import \item namnbyte vid import +\item export \item tupel \item multipla returvärden \item block diff --git a/compendium/generated/w05-chaphead-generated.tex b/compendium/generated/w05-chaphead-generated.tex index bcdfe1cfa..3b07d6352 100644 --- a/compendium/generated/w05-chaphead-generated.tex +++ b/compendium/generated/w05-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Klasser, datamodellering}\label{chapter:W05} +\chapter{Klasser och datamodellering}\label{chapter:W05} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item applikationsdomän diff --git a/compendium/generated/w06-chaphead-generated.tex b/compendium/generated/w06-chaphead-generated.tex index 196c381e9..d6c01539d 100644 --- a/compendium/generated/w06-chaphead-generated.tex +++ b/compendium/generated/w06-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Mönster, felhantering}\label{chapter:W06} +\chapter{Mönster och felhantering}\label{chapter:W06} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item mönstermatchning diff --git a/compendium/generated/w07-chaphead-generated.tex b/compendium/generated/w07-chaphead-generated.tex index ca71bd375..f72d0f35e 100644 --- a/compendium/generated/w07-chaphead-generated.tex +++ b/compendium/generated/w07-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Sekvenser, enumerationer}\label{chapter:W07} +\chapter{Sekvenser och enumerationer}\label{chapter:W07} Begrepp som ingår i denna veckas studier: \begin{multicols}{2}\begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item översikt av Scalas samlingsbibliotek och samlingsmetoder diff --git a/compendium/generated/w08-chaphead-generated.tex b/compendium/generated/w08-chaphead-generated.tex index 37f858dda..410951725 100644 --- a/compendium/generated/w08-chaphead-generated.tex +++ b/compendium/generated/w08-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Matriser, typparametrar}\label{chapter:W08} +\chapter{Nästlade och generiska strukturer}\label{chapter:W08} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item matris diff --git a/compendium/generated/w09-chaphead-generated.tex b/compendium/generated/w09-chaphead-generated.tex index 0ff8db75b..82b3be8bf 100644 --- a/compendium/generated/w09-chaphead-generated.tex +++ b/compendium/generated/w09-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Mängder, tabeller}\label{chapter:W09} +\chapter{Mängder och tabeller}\label{chapter:W09} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item innehållstest diff --git a/compendium/generated/w10-chaphead-generated.tex b/compendium/generated/w10-chaphead-generated.tex index b9805064e..9e3468654 100644 --- a/compendium/generated/w10-chaphead-generated.tex +++ b/compendium/generated/w10-chaphead-generated.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Arv, komposition}\label{chapter:W10} +\chapter{Arv och komposition}\label{chapter:W10} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item arv diff --git a/compendium/generated/w11-chaphead-generated.tex b/compendium/generated/w11-chaphead-generated.tex index 8075459a4..b891070c2 100644 --- a/compendium/generated/w11-chaphead-generated.tex +++ b/compendium/generated/w11-chaphead-generated.tex @@ -1,11 +1,18 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Kontextparametrar, api}\label{chapter:W11} +\chapter{Kontextuella abstraktioner och varians}\label{chapter:W11} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] -\item given -\item using -\item extension +\item över- och undre typgräns +\item varians +\item kontravarians +\item kovarians +\item typjoker +\item egentyp +\item givet värde (given) +\item kontextparameter (using) +\item generiska extensionsmetoder \item ad hoc polymorfism +\item kontextgräns \item typklass \item api \item kodläsbarhet diff --git a/compendium/generated/w13-chaphead-generated.tex b/compendium/generated/w13-chaphead-generated.tex index a80a941c3..b88d1d918 100644 --- a/compendium/generated/w13-chaphead-generated.tex +++ b/compendium/generated/w13-chaphead-generated.tex @@ -3,4 +3,5 @@ \chapter{Repetition}\label{chapter:W13} Begrepp som ingår i denna veckas studier: \begin{itemize}[noitemsep,label={$\square$},leftmargin=*] \item träna på extentor -\item redovisa projekt\end{itemize} +\item redovisa projekt +\item träna inför muntligt prov\end{itemize} diff --git a/compendium/generated/w14-chaphead-generated.tex b/compendium/generated/w14-chaphead-generated.tex index 07799d8d5..6eefe4ae9 100644 --- a/compendium/generated/w14-chaphead-generated.tex +++ b/compendium/generated/w14-chaphead-generated.tex @@ -1,2 +1,2 @@ %!TEX encoding = UTF-8 Unicode -\chapter{Muntligt prov}\label{chapter:W14} +\chapter{MUNTLIGT PROV}\label{chapter:W14} diff --git a/compendium/global-constants.tex b/compendium/global-constants.tex index 4fd74ca5c..d91c88037 100644 --- a/compendium/global-constants.tex +++ b/compendium/global-constants.tex @@ -1,17 +1,17 @@ -\newcommand{\LibVersion}{1.2.0} % latest version of introlib at https://github.com/lunduniversity/introprog-scalalib +\newcommand{\LibVersion}{1.3.1} % latest version of introlib at https://github.com/lunduniversity/introprog-scalalib \newcommand{\LibJar}{\texttt{introprog\_3-\LibVersion.jar}} -\newcommand{\JDKApiUrl}{\url{https://docs.oracle.com/en/java/javase/11/docs/api/}} -\newcommand{\CurrentYear}{2021} +\newcommand{\JDKApiUrl}{\url{https://docs.oracle.com/en/java/javase/17/docs/api/}} +\newcommand{\CurrentYear}{2022} \newcommand{\VMName}{vm2020} %TODO: update vm \newcommand{\VMPassword}{pgkBytMig2020} \newcommand{\VirtualBoxVersion}{6.1} %https://www.virtualbox.org/wiki/Downloads \newcommand{\UbuntuVersion}{20.04} -\newcommand{\ScalaVersion}{3.0.1} %https://www.scala-lang.org/ -\newcommand{\SbtVersion}{1.5.5} %https://eed3si9n.com/category/tags/sbt -\newcommand{\JDKVersion}{11} %https://adoptopenjdk.net/ -\newcommand{\KojoVersion}{2.9.11} %https://www.kogics.net/kojo-download -\newcommand{\VSCodeVersion}{1.59} %https://code.visualstudio.com/updates -\newcommand{\MetalsVersion}{v1.10.8} %https://marketplace.visualstudio.com/items?itemName=scalameta.metals +\newcommand{\ScalaVersion}{3.1.2} %https://www.scala-lang.org/ +\newcommand{\SbtVersion}{1.6.2} %https://eed3si9n.com/category/tags/sbt +\newcommand{\JDKVersion}{17} %https://adoptium.net/temurin/releases/?version=17 +\newcommand{\KojoVersion}{2.9.21} %https://www.kogics.net/kojo-download +\newcommand{\VSCodeVersion}{1.67} %https://code.visualstudio.com/updates +\newcommand{\MetalsVersion}{v1.16} %https://marketplace.visualstudio.com/items?itemName=scalameta.metals \newcommand{\WindowsVersion}{10} \newcommand{\ScalaIDEVersion}{4.7.0} %%DEPRECATED diff --git a/compendium/modules/old-classes-exercise.tex b/compendium/modules/old-classes-exercise.tex index a12d2e4df..2984fd6a0 100644 --- a/compendium/modules/old-classes-exercise.tex +++ b/compendium/modules/old-classes-exercise.tex @@ -662,7 +662,7 @@ \SubtaskSolved Det blir kompileringsfel eftersom konstruktorn är privat. \begin{REPL} -scala> :paste +scala> class Point private (val x: Int, val y: Int) object Point { diff --git a/compendium/modules/old-objects-exercise-with-cslib.tex b/compendium/modules/old-objects-exercise-with-cslib.tex index b63b971b2..22a3bc3ac 100644 --- a/compendium/modules/old-objects-exercise-with-cslib.tex +++ b/compendium/modules/old-objects-exercise-with-cslib.tex @@ -123,7 +123,7 @@ \SubtaskSolved \begin{REPL} -scala> :paste underjorden.scala +scala> :load underjorden.scala scala> import Underjorden._ scala> Masken.ärMullvadsmat res0: Boolean = false @@ -387,7 +387,7 @@ scala> def rak(p:Pt)(d:Int) = {w.moveTo(p._1, p._2);w.lineTo(???)} scala> def fyll(p:Pt)(s:Int) = for (i <- 0 to s){rak(???)(s)} -scala> :paste +scala> object Color { ??? } diff --git a/compendium/modules/rename-script.scala b/compendium/modules/rename-script.scala index 1fd263b0e..cc1cf13ea 100644 --- a/compendium/modules/rename-script.scala +++ b/compendium/modules/rename-script.scala @@ -2,7 +2,7 @@ // $ sbt // > project plan // > console -// scala> :paste compendium/modules/rename-script.scala +// scala> :load compendium/modules/rename-script.scala val here = "compendium/modules" diff --git a/compendium/modules/w01-intro-exercise.tex b/compendium/modules/w01-intro-exercise.tex index 88b46a67f..87f5d21f9 100644 --- a/compendium/modules/w01-intro-exercise.tex +++ b/compendium/modules/w01-intro-exercise.tex @@ -10,7 +10,7 @@ \begin{Preparations} \item \StudyTheory{01} -\item Du behöver en dator med Scala och Kojo installerad, se appendix~\ref{appendix:compile} och \ref{appendix:kojo}. +\item Du behöver en dator med Scala och Kojo, se appendix~\ref{appendix:compile} och \ref{appendix:kojo}. \end{Preparations} \else @@ -62,7 +62,7 @@ \begin{REPLnonum} > scala -Welcome to Scala 3.0.1 (OpenJDK 64-Bit Server VM, Java 11.0.8). +Welcome to Scala 3.1.2 (17.0.2, Java OpenJDK 64-Bit Server VM). Type in expressions for evaluation. Or try :help. scala -version. scala> @@ -139,7 +139,8 @@ \Subtask Vad har uttrycket \code{ "hej" * 3 } för typ och värde? Testa i REPL. -\Subtask Byt ut 3:an ovan mot ett så pass stort heltal så att minnet blir fullt. Hur börjar felmeddelandet? Är detta ett körtidsfel eller ett kompileringsfel? +\Subtask Byt ut 3:an ovan mot ett så pass stort heltal så att minnet blir fullt, +men inte så stort att talet inte får plats i det givna omfånget för grundtypen \code{Int}. Hur börjar felmeddelandet? Är detta ett körtidsfel eller ett kompileringsfel? \Subtask Välj ett värde på argumentet efter operatorn \code{*} så att ett typfel genereras. Hur börjar felmeddelandet? Är detta ett körtidsfel eller ett kompileringsfel? @@ -686,22 +687,17 @@ \Task \what~På veckans laboration ska du använda Kojo för att verifiera att du kan använda sekvens, alternativ, repetition och abstraktion. Med Kojo ska du skapa Scala-program som ritar färgglada figurer med hjälp av ett lättanvänt Scala-bibliotek för \emph{turtle graphics}\footnote{\url{https://en.wikipedia.org/wiki/Turtle_graphics}}. -Observera att Kojo använder Scala 2 och därmed den gamla syntaxen för kontrollstrukturer med nödvändiga parenteser runt villkorsuttryck, utan varken \code{do} eller \code{then}, och varken valfria klammerparenteser eller indenteringssyntax. +Om du använder Kojo som ett grafikbibliotek (rekommenderas) och kör med \texttt{scala-cli} (se Appendix \ref{appendix:kojo}) så kan du använda Scala 3. Men kör du Kojo Deskop eller Webb-Kojo så är det Scala 2 som gäller och även om det mesta i veckans labb fungerar lika i Scala 2 och Scala 3 så kräver Scala 2 den gamla syntaxen för kontrollstrukturer med nödvändiga parenteser runt villkorsuttryck, utan varken \code{do} eller \code{then}, och varken valfria klammerparenteser eller indenteringssyntax. -Starta Kojo (se appendix \ref{appendix:kojo}). Om du inte redan har svenska menyer: välj svenska i språkmenyn och starta om Kojo. Skriv in nedan program och tryck på den \emph{gröna} play-knappen. Notera kopplingen mellan satssekvensen och vad som händer i ritfönstret. +Skriv in och kör nedan program med valfri metod enligt Appendix \ref{appendix:kojo}. Notera kopplingen mellan satsernas ordning och vad som händer i ritfönstret. \begin{Code} -sudda - fram; höger fram; vänster färg(grön) fram \end{Code} -\noindent - - -\Subtask Vad händer om du \emph{inte} börjar programmet med \code{sudda} och kör samma program upprepade gånger? Varför är det bra att börja programmet med \code{sudda}? +\noindent Om du kör Kojo Desktop är det bra att börjar programmet med \code{sudda} (varför det?\footnote{När du trycker på playknappen i Kojo Desktop så nollställs varken canvas i ritfönstret eller paddans tillstånd. Genom att börja dina Kojo Desktop-program med \code{sudda} så startar du exekveringen i exakt samma utgångsläge: en tom canvas där paddan pekar uppåt, pennan är nere och pennans färg är röd.}). \Subtask Skriv kod som ritar en kvadrat enligt bilden nedan. \vspace{1em}\\\includegraphics[width=0.47\textwidth]{../img/kojo/kvadrat} @@ -726,7 +722,8 @@ \code|fyll(genomskinlig)| & Gör så att paddan \emph{inte} fyller i något när den ritar. \\ \code|bredd(20)| & Gör så att pennan får bredden 20. \\ \code|bakgrund(svart)| & Bakgrundsfärgen blir svart. \\ -\code|bakgrund2(grön,gul)| & Bakgrund med övergång från grönt till gult. \\ +%bakgrund2 ger ingen gradient i iKojo på webben http://kojo.lu.se/ +%\code|bakgrund2(grön,gul)| & Bakgrund med övergång från grönt till gult. \\ \code|pennaNer| & Sätter ner paddans penna så att den ritar när den går. \\ \code|pennaUpp| & Sänker paddans penna så att den \emph{inte} ritar när den går. \\ \code|höger(45)| & Paddan vrider sig 45 grader åt höger. \\ @@ -739,7 +736,8 @@ \code|väster| & Paddan vrider sig så att nosen pekar åt vänster. \\ \code|norr| & Paddan vrider sig så att nosen pekar uppåt. \\ \code|söder| & Paddan vrider sig så att nosen pekar neråt. \\ -\code|mot(100,200)| & Paddan vrider sig så att nosen pekar mot läget (100, 200) \\ +%mot funkar inte i iKojo på webben http://kojo.lu.se/ +%\code|mot(100,200)| & Paddan vrider sig så att nosen pekar mot läget (100, 200) \\ \code|sättVinkel(90)| & Paddan vrider nosen till vinkeln 90 grader. \\ \end{longtable} %\label{lab:kojo:kojo-procedures} @@ -747,7 +745,7 @@ \end{table} \begin{framed} -\noindent\emph{Tips inför fortsättningen:} Ha gärna både REPL och Kojo igång samtidigt. Då kan du undersöka hur olika kodkonstruktioner fungerar i REPL, medan du stegvis skapar allt större program i editorn i Kojo. Detta sätt att jobba har du nytta av under resten av kursen, både om du använder en texteditor och kompilerar i terminalen, och om du använder en professionell integrerad utvecklingsmiljö. Oavsett vilka andra verktyg du kör är det användbart att ha REPL igång i ett eget fönster som hjälp i den kreativa processen, medan du jagar buggar och medan du lär dig nya koncept. Så fort du undrar hur något fungerar i Scala: fram med REPL och testa! +\noindent\emph{Tips inför fortsättningen:} Ha både REPL och en editor igång samtidigt. Då kan du undersöka hur olika kodfragment fungerar i REPL, medan du \emph{stegvis} skapar allt större program i editorn. Detta sätt att jobba har du stor nytta av under resten av kursen. Oavsett vilka andra verktyg du kör är det användbart att ha REPL igång i ett eget fönster som hjälp i den kreativa processen, medan du jagar buggar och medan du lär dig nya koncept. Så fort du undrar hur något fungerar i Scala: \textbf{fram med REPL och testa!} \end{framed} @@ -1749,20 +1747,14 @@ - - - - -\WHAT{Dekorera \code{Int} med extra operatorer.} +\WHAT{Extra operatorer för exakt multiplikation.} \QUESTBEGIN -\Task\Uberkurs \what\footnote{En utmanande överkursuppgift som visar Scalas kraftfullhet. Se fördjupningslänkar i facit.}\\Kim Kodmagiker tycker att \code{Math.multiplyExact} är för krångligt att skriva och utökar därför typen \code{Int} med en extra operator: +\Task\Uberkurs \what~Kim Kodmagiker tycker att \\\code{Math.multiplyExact} är för krångligt att skriva och utökar därför typen \code{Int} med en extra operator: \begin{Code} -implicit class IntDecorator(val i: Int) extends AnyVal { - def *!(j: Int) = Math.multiplyExact(i,j) -} +extension (i: Int) def *!(j: Int) = Math.multiplyExact(i,j) \end{Code} \Subtask Klistra in koden ovan i REPL och prova den extra operatorn. @@ -1789,30 +1781,20 @@ \end{REPL} -Kort förklaring: -\begin{itemize} -\item \code{implicit class MinDekorator(x: Typ)} gör så att operationer i dekoratorklassen \code{MinDekorator} automatiskt görs tillgängliga på värden av typen \code{Typ}.% -\footnote{Fördjupning: \url{http://docs.scala-lang.org/overviews/core/implicit-classes.html}} - -\item \code{extends AnyVal} gör så att kompilatorn försöker generera maskinkod som blir lika effektiv som vid direkt användning av det underliggande värdet.% -\footnote{Fördjupning: \url{http://docs.scala-lang.org/overviews/core/value-classes.html}} -\end{itemize} - \SubtaskSolved \begin{Code} -implicit class IntDecorator(val i: Int) extends AnyVal{ +extension (i: Int) def *!(j: Int) = Math.multiplyExact(i,j) def +!(j: Int) = Math.addExact(i,j) def -!(j: Int) = Math.subtractExact(i,j) -} \end{Code} \SubtaskSolved Det blir lätt väldigt kryptiskt med namn som består av flera specialtecken. Om du \emph{verkligen} vill ha sådana operatorer är det \emph{mycket} lämpligt att också erbjuda varianter i klartext: \begin{Code} -implicit class IntDecorator(val i: Int) extends AnyVal{ +extension (i: Int) def mulExact(j: Int) = Math.multiplyExact(i,j) def *!(j: Int) = i mulExact j @@ -1821,7 +1803,6 @@ def subExact(j: Int) = Math.subtractExact(i,j) def -!(j: Int) = i subExact j -} \end{Code} diff --git a/compendium/modules/w01-intro-lab.tex b/compendium/modules/w01-intro-lab.tex index b2fd24fbe..3582179e9 100644 --- a/compendium/modules/w01-intro-lab.tex +++ b/compendium/modules/w01-intro-lab.tex @@ -10,7 +10,7 @@ \begin{Preparations} \item Repetera veckans föreläsningsmaterial. \item \DoExercise{\ExeWeekONE}{01}%Gör övning {\tt \ExeWeekONE} i kapitel \ref{exe:W01}. -\item Läs om Kojo i appendix \ref{appendix:kojo}. Kojo är förinstallerat på LTH:s datorer; om du vill installera Kojo på din egen dator, följ instruktionerna i \ref{appendix:ide:kojo:install}. +\item Läs om Kojo i appendix \ref{appendix:kojo}. Kojo Desktop är förinstallerat på LTH:s datorer; om du vill installera Kojo Desktop på din egen dator, följ instruktionerna i \ref{appendix:ide:kojo:install}. Du kan också köra Kojo i din webbläsare här: \url{http://kojo.lu.se/} \item Läs igenom hela laborationen nedan. Fundera på möjliga lösningar till de uppgifter som är markerade med en penna i marginalen. % \item Ladda hem och studera översiktligt detta dokument (25 sidor, det räcker att du bläddrar igenom dokumentet och får en uppfattning om hur Kojo kan användas): \\ ''Introduction to Kojo'' \url{http://www.kogics.net/kojo-ebooks#intro} \end{Preparations} @@ -100,39 +100,39 @@ \subsection{Obligatoriska uppgifter} %\Subtask\Checkpoint Visa dina resultat för en handledare och diskutera hur uppgifterna ovan illustrerar principen om sekvens. \vspace{1em} -\Task Starta Kojo (se övning {\tt \ExeWeekONE} i kapitel \ref{exe:W01}). +% \Task Läs om hur du gör grafikprogram med Kojo i Appendix \ref{appendix:kojo} och övning {\tt \ExeWeekONE} i kapitel \ref{exe:W01}. -\Task \textit{Sekvens och repetition}. -\Subtask Rita en kvadrat med hjälp av proceduren \code+upprepa(n){ ??? }+ där du ersätter \code{n} med antalet repetitioner och \code{???} med de satser som ska repeteras. +\Task \textit{Sekvens och repetition}. Rita en kvadrat med hjälp av \code+upprepa(n){ ??? }+ där du ersätter \code{n} med antalet repetitioner och \code{???} med de satser som ska repeteras. -\Subtask Kör ditt program med den \emph{gula} play-knappen för programspårning. Studera exekveringssekvensen. Klicka på anropen i programspårningsfönstret och studera markeringarna i ritfönstret. +%\Subtask Om du kör Kojo Desktop: Prova att köra ditt program med den \emph{gula} play-knappen för programspårning. Studera exekveringssekvensen. Klicka på anropen i programspårningsfönstret och studera markeringarna i ritfönstret. -\Task \textit{Variabel och repetition} +\Task \textit{Variabel och repetition}. \Subtask Funktionen \code{System.currentTimeMillis} ingår i Javas standardbibliotek och ger ett heltal av typen \code{Long} med det nuvarande antalet millisekunder sedan midnatt den första januari 1970. Med Kojo-proceduren \code{sakta(0)} blir det ingen fördröjning när paddan ritar och utritningen sker så snabbt som möjligt. Prova nedan program och förklara vad som händer. \begin{Code} -sudda; sakta(0) +sakta(0) val n = 800 * 4 val t1 = System.currentTimeMillis upprepa(n){ upprepa(4){ fram; höger } } val t2 = System.currentTimeMillis println(s"$n kvadratvarv tog ${t2 - t1} millisekunder") \end{Code} +\noindent Om du kör Kojo Desktop är det bra att börjar programmet med \code{sudda}. (Varför?) \Subtask\Pen Anteckna ungefär hur många kvadratvarv per sekund som paddan kan rita när den är som snabbast. Kör flera gånger eftersom den virtuella maskinen behöver ''värmas upp'' för att maskinkoden ska optimeras. Vissa körningar kan gå långsammare om skräpsamlaren behöver lägga tid på att frigöra minne. \Subtask\Pen Vad har variablerna i koden ovan för namn? Vad har variablerna för värden? -\Subtask Rita en kvadrat igen, men nu med hjälp av en \code{while}-sats och en loopvariabel. Studera exekveringen med programspårning (den gula play-knappen). +\Subtask Rita en kvadrat igen, men nu med hjälp av en \code{while}-sats och en loopvariabel. %Studera exekveringen med programspårning (den gula play-knappen). \begin{Code} -sudda; sakta(100) +sakta(100) var i = 0 while (???) { fram; höger; i = ??? } \end{Code} @@ -163,8 +163,6 @@ \subsection{Obligatoriska uppgifter} \Subtask Använd en repetition för att abstrahera nedan sekvens, så att programmet blir kortare: \begin{Code} -sudda - fram; höger; hoppa; fram; vänster; hoppa; fram; höger; hoppa; fram; vänster; hoppa; fram; höger; hoppa; fram; vänster; hoppa; fram; höger; hoppa; fram; vänster; hoppa; @@ -180,7 +178,7 @@ \subsection{Obligatoriska uppgifter} \end{Code} -\Subtask Anropa din abstraktion efter att den deklarerats och efter att du exekverat:\\\code{sudda; sakta(100)} +\Subtask Anropa din abstraktion efter att den deklarerats och efter att du exekverat:\\\code{sakta(100)} \Subtask Anropa din abstraktion inuti en \code{for}-loop så att paddan ritar en stapel som är 10 kvadrater hög enligt bilden nedan. @@ -198,17 +196,21 @@ \subsection{Obligatoriska uppgifter} \end{Code} \end{multicols} + \caption{En kvadratstapel.\label{fig:kojo-lab:column}} \end{figure} -\Subtask Kör ditt program med den \emph{gula} play-knappen. Studera hur anrop av proceduren \code{kvadrat} påverkar exekveringssekvensen av dina satser. Vid vilka punkter i programmet sker ett ''hopp'' i sekvensen i stället för att efterföljande sats exekveras? Använd lämpligt argument till \code{sakta} för att du ska hinna studera exekveringen. +\Subtask %Kör ditt program med den \emph{gula} play-knappen. +Studera hur anrop av proceduren \code{kvadrat} påverkar exekveringssekvensen av dina satser genom att göra lämpliga utskrifter så att du kan se när olika delar av koden exekveras. Vid vilka punkter i programmet sker ett ''hopp'' i sekvensen i stället för att efterföljande sats exekveras? Använd lämpligt argument till \code{sakta} för att du ska hinna studera exekveringen. -\Subtask Rita samma bild med 10 staplade kvadrater som ovan, men nu \emph{utan} att använda abstraktionen \code{kvadrat} -- använd i stället en nästlad repetition (alltså en upprepning inuti en upprepning). Vilket av de två sätten (med och utan abstraktionen \code{kvadrat}) är lättast att läsa? %\emph{Tips:} Varje gång du trycker på någon av play-knapparna, sparas ditt program. Du kan se dina sparade program om du klickar på \emph{Historik}-fliken. Du kan också stega bakåt och framåt i historiken med de blå pilarna bredvid play-knapparna. +\Subtask Rita samma bild med 10 staplade kvadrater (se bild \ref{fig:kojo-lab:column} på sidan \pageref{fig:kojo-lab:column}), men nu \emph{utan} att använda abstraktionen \code{kvadrat} -- använd i stället en nästlad repetition (alltså en upprepning inuti en upprepning). Vilket av de två sätten (med och utan abstraktionen \code{kvadrat}) är lättast att läsa? %\emph{Tips:} Varje gång du trycker på någon av play-knapparna, sparas ditt program. Du kan se dina sparade program om du klickar på \emph{Historik}-fliken. Du kan också stega bakåt och framåt i historiken med de blå pilarna bredvid play-knapparna. -\Subtask Generalisera din abstraktion \code{kvadrat} genom att ge den en parameter \code{sida: Double} som anger hur stor kvadraten blir. Rita flera kvadrater i likhet med bilden nedan. +\Subtask Generalisera din abstraktion \code{kvadrat} genom att ge den en parameter \code{sida: Double} som anger hur stor kvadraten blir. Rita flera kvadrater i likhet med bild \ref{fig:kojo-lab:resize} på sidan \pageref{fig:kojo-lab:resize}). \begin{figure}[H] \includegraphics{../img/kojo/square-param} + \caption{Olika stora kvadrater.\label{fig:kojo-lab:resize}} + \end{figure} @@ -230,10 +232,10 @@ \subsection{Obligatoriska uppgifter} \Task \emph{Alternativ.} \label{kojo:alt} -\Subtask Kör programmet nedan. Förklara vad som händer. Använd den gula play-knappen för att studera exekveringen. +\Subtask Kör programmet nedan. Förklara vad som händer. %Använd den gula play-knappen för att studera exekveringen. \begin{Code} -sudda; sakta(5000) +sakta(5000) def move(key: Int): Unit = { println("key: " + key) @@ -245,10 +247,10 @@ \subsection{Obligatoriska uppgifter} move(83); move('S'); move('S'); move('S') \end{Code} -\Subtask \label{subtask:keypress} Kör programmet nedan. Notera \code{activateCanvas} för att du ska slippa klicka i ritfönstret innan du kan styra paddan. Anropet \code{onKeyPress(move)} gör så att \code{move} kommer att anropas då en tangent trycks ned. Lägg till kod i \code{move} som gör att tangenten A ger en vridning moturs med 5 grader medan tangenten D ger en vridning medurs 5 grader. Med \code{onKeyPress} bestämmer man vilken procedur som ska köras vid tangenttryck. +\Subtask \label{subtask:keypress} Kör programmet nedan. Notera \code{activateCanvas()} för att du ska slippa klicka i ritfönstret innan du kan styra paddan. Anropet \code{onKeyPress(move)} gör så att \code{move} kommer att anropas då en tangent trycks ned. Lägg till kod i \code{move} som gör att tangenten A ger en vridning moturs med 5 grader medan tangenten D ger en vridning medurs 5 grader. Med \code{onKeyPress} bestämmer man vilken procedur som ska köras vid tangenttryck. \begin{Code} -sudda; sakta(0); activateCanvas +sakta(0); activateCanvas() def move(key: Int): Unit = { println("key: " + key) @@ -281,7 +283,7 @@ \subsection{Kontrollfrågor}\Checkpoint \item Hur deklareras och initialiseras en variabel vars värde är förändringsbart? \item Hur deklareras och initialiseras en variabel vars värde är oföränderligt? \item Är det ett körtidsfel eller kompileringsfel att tilldela en oföränderlig variabel ett nytt värde? -\item Ange vilken av \code{for} och \code{while} är lämpligast i dessa fall: +\item Ange vilken av \code{for} och \code{while} som är lämpligast i dessa fall: \begin{itemize}[noitemsep, nolistsep] \item[A.] Summera de hundra första heltalen. \item[B.] Räkna antal tecken i en sträng innan första blanktecken. @@ -304,7 +306,7 @@ \subsection{Frivilliga extrauppgifter} def kvadrat = ??? def stapel(n: Int) = ??? -sudda; sakta(100) +sakta(100) stapel(42) \end{Code} @@ -422,7 +424,7 @@ \subsection{Frivilliga extrauppgifter} \end{REPLnonum} -\Subtask Ändra i koden i uppgift \ref{task:timer}) så att \code{while}-loopen bara kör 5 gånger. Kör programmet med den \emph{gula} play-knappen. Scrolla i programspårningen och förklara vad som händer. Klicka på \code{CALL}-rutorna och se vilken rad som markeras i ditt program. +\Subtask Ändra i koden i uppgift \ref{task:timer}) så att \code{while}-loopen bara kör 5 gånger. %Kör programmet med den \emph{gula} play-knappen. Scrolla i programspårningen och förklara vad som händer. Klicka på \code{CALL}-rutorna och se vilken rad som markeras i ditt program. \Subtask Lägg till koden nedan i ditt program och försök ta reda på ungefär hur långt din dator hinner räkna till på en sekund för \code{Long}- respektive \code{Int}-variabler. Använd den gröna play-knappen. \begin{CodeSmall} diff --git a/compendium/modules/w03-functions-exercise.tex b/compendium/modules/w03-functions-exercise.tex index 12d60bbf1..ffb8a6122 100644 --- a/compendium/modules/w03-functions-exercise.tex +++ b/compendium/modules/w03-functions-exercise.tex @@ -201,7 +201,7 @@ \end{Code} -\noindent\emph{Tips:} Klistra in hela singelobjektet i REPL och testa att anropa funktionerna om du är osäker på vad som händer. Om du gör \code{import inSearchOfPurity._} kommer du åt namnen i singelobjektet direkt och kan lätt undersöka variablernas värden. +\noindent\emph{Tips:} Klistra in hela singelobjektet i REPL och testa att anropa funktionerna om du är osäker på vad som händer. Om du gör \code{import inSearchOfPurity.*} kommer du åt namnen i singelobjektet direkt och kan lätt undersöka variablernas värden. \SOLUTION diff --git a/compendium/modules/w03-functions-lab.tex b/compendium/modules/w03-functions-lab.tex index faaea93f6..94d461da0 100644 --- a/compendium/modules/w03-functions-lab.tex +++ b/compendium/modules/w03-functions-lab.tex @@ -7,7 +7,7 @@ \end{Goals} \begin{Preparations} -\item Gör övning \texttt{\ExeWeekTHREE} och repetera övning \texttt{\ExeWeekTWO}. +\item Gör övning \texttt{\ExeWeekTHREE} och repetera övning \texttt{\ExeWeekTWO} innan du påbörjar laborationen. \item Läs appendix~\ref{appendix:terminal} och~\ref{appendix:compile}. \item Utveckla en första, spelbar version av ditt textspel, som du kan jobba vidare på under laborationen. @@ -34,6 +34,18 @@ \subsection{Krav} %\item Slumptal ska ingå i ditt spel och styra valfria delar av exekveringen. Det ska även gå att ge ett valfritt slumptalsfrö som argument vid exekveringen av ditt program. Om fröargument ges ska exekveringen bli återupprepningsbar för en given indatasekvens, annars ska utfallet kunna bli olika vid upprepade körningar med samma indata. \end{itemize} +\subsection{Tips för att komma igång} + +\begin{itemize} +\item Skapa en katalog som innehåller en scala-kodfil med valfritt namn. +\item Skriv en enkel \code{@main}-metod i den nyskapade kodfilen som endast skriver ut strängen \code{"Hello World!"}. +\item Kompilera och kör, rätta eventuella fel tills programmet fungerar korrekt. +\item När programmet fungerar, börja utöka \code{@main}-metoden i din kodfil och implementera mer funktionalitet, ta en titt under inspiration nedan. +\item Börja enkelt och försök formulera vad ditt program ska göra med \emph{psuedokod} som kommentarer innan du skriver koden. +\item Kompilera och kör vid varje tillägg och håll varje tillägg så litet som möjligt, så slipper du reda ut en massa svåra följdfel vid kompilering och eventuella körtidsfel blir mer begripliga. +\item Fortsätt utöka tills kraven för labben har uppnåtts. +\end{itemize} + \subsection{Inspiration} Här följer en lista med olika förslag på funktioner som du kan välja bland, kombinera och variera på olika vis. Du kan också låta helt andra funktioner ingå i ditt spel. Det viktigaste är att du kombinerar kodglädje med lärorika utmaningar :) @@ -58,7 +70,6 @@ \subsection{Inspiration} \item Gör det möjligt att ge ett extra argument med en ''fuskkod'' som ger användaren speciella förmågor eller på annat sätt underlättar för användaren under spelets gång. \end{itemize} - %\subsection{Tips} %\begin{itemize} diff --git a/compendium/modules/w04-objects-exercise-goals.tex b/compendium/modules/w04-objects-exercise-goals.tex index 74f1842e2..352809fc9 100644 --- a/compendium/modules/w04-objects-exercise-goals.tex +++ b/compendium/modules/w04-objects-exercise-goals.tex @@ -17,6 +17,7 @@ \item Kunna använda import av medlemmar i objekt och paket. \item Kunna byta namn vid import. +\item Kunna förklara skillnaden mellan import och export. \item Kunna skapa och använda variabler med fördröjd initialisering. %\item Kunna förklara när parenteserna kan skippas runt tupel-argument. diff --git a/compendium/modules/w04-objects-exercise.tex b/compendium/modules/w04-objects-exercise.tex index 446656476..425a939be 100644 --- a/compendium/modules/w04-objects-exercise.tex +++ b/compendium/modules/w04-objects-exercise.tex @@ -151,6 +151,44 @@ +\WHAT{Export.} + +\QUESTBEGIN + +\Task \what~ + +\Subtask Jämför \code{import} och \code{export} genom att beskriva en likhet och en skillnad. + +\Subtask Skapa ett exempel i REPL som demonstrerar nyttan med \code{export}. + +\SOLUTION + +\TaskSolved \what~ + +\SubtaskSolved Likhet: Både \code{import} och \code{export} styr synlighet. Skillnad: \code{import} styr lokal synlighet \emph{inuti} ett objekt medan \code{export} styr synlighet \emph{utanför} ett objekt. + +\SubtaskSolved Man kan med \code{export} på ett smidigt sätt plocka ihop medlemmar från andra objekt och göra dem synliga från mitt eget objekt. +\begin{CodeSmall} +object MittObjekt: + export java.awt.Color.* // alla färger blir medlemmar i MittObjekt + export math.{atan2, Pi} // atan2 och Pi blir medlemmar i MittObjekt +\end{CodeSmall} + +\begin{REPLsmall} +scala> object MittObjekt: + | export java.awt.Color.* + | export math.{atan2, Pi} + | + +scala> MittObjekt.RED +val res0: java.awt.Color = java.awt.Color[r=255,g=0,b=0] + +scala> MittObjekt.atan2(3,3) / MittObjekt.Pi +val res1: Double = 0.25 +\end{REPLsmall} + +\QUESTEND + \WHAT{Tupler.} @@ -299,8 +337,66 @@ +\WHAT{Extensionsmetoder.} + +\QUESTBEGIN + +\Task \what~Extensionsmetoder möjliggör punktnotation på värden av befintliga typer. + +\Subtask Skapa extensionsmetod på heltal som möjliggör inkrementering. +\begin{REPLnonum} +scala> 42.inc +val res0: Int = 43 +\end{REPLnonum} + +\Subtask Skapa extensionsmetod på heltal som möjliggör dekrementering. +\begin{REPLnonum} +scala> 42.dec +val res1: Int = 41 +\end{REPLnonum} + +\Subtask Sammanför extensionsmetoderna i så att de blir \emph{kollektiva}, alltså under en och samma \code{extension}. Använd även \code{math.incrementExact} och \code{math.decrementExact} efter att du söka upp dokumentationen för dessa här: \url{https://docs.oracle.com/en/java/javase/17/docs/api/} + +\Subtask Vad är fördelen med \code{math.incrementExact} och \code{math.decrementExact}? + + \WHAT{Jar-fil. Classpath. Paket.} +\SOLUTION + +\TaskSolved \what~ + +\SubtaskSolved +\begin{REPLnonum} +scala> extension (i: Int) def inc = i + 1 +\end{REPLnonum} + +\SubtaskSolved +\begin{REPLnonum} +scala> extension (i: Int) def dec = i - 1 +\end{REPLnonum} + +\SubtaskSolved +\begin{Code} +extension (i: Int) + def inc = math.incrementExact(i) + def dec = math.decrementExact(i) +\end{Code} + +\SubtaskSolved Med \code{math.incrementExact} och \code{math.decrementExact} ges exception om vi går över gränsen: +\begin{REPLnonum} +scala> math.incrementExact(Int.MaxValue) +java.lang.ArithmeticException: integer overflow + at java.base/java.lang.Math.incrementExact(Math.java:1023) + at scala.math.incrementExact(package.scala:418) + ... 34 elided +\end{REPLnonum} + + +\QUESTEND + + + \QUESTBEGIN \Task \what~En jar-fil används för att samla färdigkompilerade program, kod, dokumentation, resursfiler, etc, i en enda fil. En jar-fil är komprimerad på samma sätt som en zip-fil. I kursen använder vi ett paket med namnet \code{introprog} som ligger i en jarfil som lämpligen ges namnet \LibJar~ där första numret anger den Scala-version som biblioteket är kompilerat för och andra numret anger bibliotekets version som ändras vid varje ny utgåva. @@ -311,15 +407,15 @@ och leta efter beskrivningen av klassens konstruktor. \Subtask Ladda ner senaste utgåvan av jar-filen med \code{introprog}-paketet här: -\\\url{http://cs.lth.se/pgk/lib}\\eller här: \url{https://github.com/lunduniversity/introprog-scalalib/releases} -\\ Spara filen med namnet \LibJar~på lämplig plats. Du kan också ladda ner filen direkt i terminalen med kommandot \code{wget} så här, där optionen \code{-O} med stort O anger utfilens namn:\\ -\texttt{wget -O \LibJar~http://cs.lth.se/pgk/lib} +\\\url{https://fileadmin.cs.lth.se/introprog.jar}\\eller här: \url{https://github.com/lunduniversity/introprog-scalalib/releases} +\\ Spara filen med namnet \LibJar~på lämplig plats. Du kan också ladda ner filen direkt i terminalen med kommandot \code{curl} så här (notera att det är stora bokstaven \code{O} och inte en nolla i optionen \code{-sLO}):\\ +\texttt{curl -sLO https://fileadmin.cs.lth.se/introprog.jar} -\Subtask Testa \code{PixelWindow} i REPL enligt nedan. Använd optionen \texttt{-cp} med argumentet \LibJar. Optionen \code{cp} är en förkortning av \emph{classpath} och med den gör du så att koden i \LibJar~blir synlig i REPL. Skriv kod som ritar en kvadrat med sidan $100$ och som har sitt vänstra, övre hörn i punkten $(100,100)$, genom att fortsätta på nedan påbörjade kod: \footnote{Från Scala 3.1.0 så behövs inte optionen \texttt{-repl}.} +\Subtask Testa \code{PixelWindow} i REPL enligt nedan. Använd optionen \texttt{-cp} med argumentet \LibJar. Optionen \code{cp} är en förkortning av \emph{classpath} och med den gör du så att koden i \LibJar~blir synlig i REPL. Skriv kod som ritar en kvadrat med sidan $100$ och som har sitt vänstra, övre hörn i punkten $(100,100)$, genom att fortsätta på nedan påbörjade kod: \begin{REPL} -> wget -O introprog_3-1.2.0.jar http://cs.lth.se/pgk/lib -> scala -cp introprog_3-1.2.0.jar -repl +> curl -sLO https://fileadmin.cs.lth.se/introprog.jar +> scala -cp introprog.jar scala> val w = new introprog.PixelWindow(400,300,"HEJ") scala> w.line(100, 100, 200, 100) scala> w.line(200, 100, 200, 200) @@ -687,6 +783,17 @@ \Subtask Vilket av objekten i modulen \code{stringUtils} har tillstånd? Är det förändringsbart? +\Subtask Ändra metoderna i singelobjektet \code{count} så att de blir extensionsmetoder och kan anropas så här: +\begin{REPLnonum} +scala> import stringUtils.count + +scala> val s = "Hejsan hoppsan. Gurka är gott." +val s: String = Hejsan hoppsan. Gurka är gott. + +scala> (s.nbrOfLetters, s.nbrOfWords, s.nbrOfSentences) +val res0: (Int, Int, Int) = (24,5,2) +\end{REPLnonum} + \SOLUTION @@ -724,6 +831,16 @@ \SubtaskSolved Objektet \code{statistics} har ett förändringsbart tillstånd i variabeln \code{history}. Tillståndet ändras vid anrop av \code{printFreq}. +\SubtaskSolved +\begin{Code} + object count: + extension (s: String) + def nbrOfLetters:Int = s.count(_.isLetter) + def nbrOfWords:Int = split.words(s).size + def nbrOfSentences: Int = split.sentences(s).size +\end{Code} + + \QUESTEND @@ -996,11 +1113,11 @@ \SubtaskSolved \begin{Code} -def repeat(n: Int)(p: Int => Unit): Unit = { +def repeat(n: Int)(p: Int => Unit): Unit = var i = 0 while i < n do - p(i); i += 1 -} + p(i) + i += 1 \end{Code} \SubtaskSolved @@ -1016,6 +1133,126 @@ \QUESTEND +\WHAT{Hur klara sig utan \code{do while} i Scala 3?} + +\QUESTBEGIN + +\Task \what~I många språk finns en konstruktion med följande syntax: \code{do while } där \code{} görs minst en gång innan sanningsvärdet för testas. Denna ''bakvända while'' används inte så ofta, men kan vara smidig om man vill köra en repetition minst en gång. + +Denna konstruktion finns i Scala 2 men inte i Scala 3 eftersom nyckelordet \code{do} i Scala 3 används vid valfria klammerparenteser och indenteringssyntax i ''vanliga while''. Ett skäl att det kan anses ok att ta bort \code{do while } är att en ''bakvänd while'' ändå i Scala 3 går att skriva om till en ''vanlig while'' genom att inkludera satserna som ska göras minst en gång i ett block på villkorets plats och låta satserna i loopen vara tomma värdet, alltså: +\begin{Code} +while + + +do () +\end{Code} + +\Subtask Nedan funkar i Scala 2, men vad händer om du försöker göra detta i Scala 3: +\begin{REPLnonum} +> scala-cli repl -S 2 +Welcome to Scala 2.13.8 (OpenJDK 64-Bit Server VM, Java 17.0.3). +Type in expressions for evaluation. Or try :help. + +scala> var i = 0 +var i: Int = 0 + +scala> do i += 1 while (i < 10) + +scala> i +val res20: Int = 10 +\end{REPLnonum} + +\Subtask Skriv om ''bakvända'' \code{do while} till en motsvarande ''vanlig'' \code{while do} som fungerar i Scala 3. + + +\SOLUTION + +\TaskSolved \what + +\SubtaskSolved Det blir kompileringsfel: +\begin{REPLnonum} +> scala-cli repl -S 3 +Welcome to Scala 3.1.3 (17.0.3, Java OpenJDK 64-Bit Server VM). +Type in expressions for evaluation. Or try :help. + +scala> var i = 0 +var i: Int = 0 + +scala> do i += 1 while (i < 10) +-- [E103] Syntax Error: ---------------------------------------- +1 |do i += 1 while (i < 10) + |^^ + |Illegal start of statement +\end{REPLnonum} + +\SubtaskSolved +\begin{REPLnonum} +> scala-cli repl -S 3 +Welcome to Scala 3.1.3 (17.0.3, Java OpenJDK 64-Bit Server VM). +Type in expressions for evaluation. Or try :help. + +scala> var i = 0 +var i: Int = 0 + +scala> while + | i += 1 + | i < 10 + | do () + +scala> i +val res0: Int = 10 +\end{REPLnonum} + + + +\QUESTEND + + +\WHAT{Postfixa operatorer för inkrementering och dekrementering.} + +\QUESTBEGIN + +\Task \what~I många språk, t.ex. Java, C++, C, går det att skriva \code{i++} och \code{i--} om man vill räkna upp eller ner heltalsvariabeln \code{i}. Använd Scalas extensionsmetoder för att göra så att det går att använda operatorerna \code{++} och \code{--} på heltal, enligt nedan: +\begin{REPLnonum} +scala> 42.++ +val res0: Int = 43 + +scala> 42.-- +val res1: Int = 41 + +scala> import language.postfixOps // tillåter postfix operatornotation + +scala> 43 ++ +val res2: Int = 44 + +scala> 43 -- +val res3: Int = 42 + +scala> val i = 42 +val i: Int = 42 + +scala> i++ +val res4: Int = 43 + +scala> i-- +val res5: Int = 41 +\end{REPLnonum} + +\SOLUTION + +\TaskSolved \what~ + +\begin{Code} +extension (i: Int) + def ++ = i + 1 + def -- = i - 1 +\end{Code} + + +\QUESTEND + + + \WHAT{Använda färdigt paket: Färgväljare.} @@ -1028,11 +1265,9 @@ % scala> välj() % \end{REPL} \begin{REPL} -> scala -cp introprog_3-1.2.0.jar -repl +> scala -cp introprog_3-1.3.1.jar scala> introprog.Dialog.selectColor() \end{REPL} -Från Scala 3.1.0 så behövs inte optionen \texttt{-repl}. - \Subtask Vad händer om du trycker \Button{Ok} efter att du valt en grön färg? diff --git a/compendium/modules/w04-objects-lab.tex b/compendium/modules/w04-objects-lab.tex index 91394ecbc..31844404a 100644 --- a/compendium/modules/w04-objects-lab.tex +++ b/compendium/modules/w04-objects-lab.tex @@ -1,5 +1,5 @@ %!TEX encoding = UTF-8 Unicode -%!TEX root = ../labs.tex +%!TEX root = ../compendium1.tex \Lab{\LabWeekFOUR} \begin{Goals} @@ -167,8 +167,8 @@ \subsection{Obligatoriska uppgifter} type Pos = (Int, Int) def block(pos: Pos)(color: JColor = JColor.gray): Unit = { - val x = ??? //räkna ut fönstrets x-koordinat i pixlar istf block - val y = ??? //räkna ut fönstrets y-koordinat i pixlar istf block + val x = ??? //räkna ut blockets x-koordinat i pixelfönstret + val y = ??? //räkna ut blockets y-koordinat i pixelfönstret window.fill(???) } \end{Code} diff --git a/compendium/modules/w05-classes-exercise.tex b/compendium/modules/w05-classes-exercise.tex index c08cb6215..3c9e86679 100644 --- a/compendium/modules/w05-classes-exercise.tex +++ b/compendium/modules/w05-classes-exercise.tex @@ -270,7 +270,7 @@ Alla klasser ska tillhöra \code{package blockbattle} och ligga i varsin egen fil med samma namn som klassen, t.ex. \code{Pos.scala}. När du har mer än en kodfil som du vill kompilera om upprepade gånger vid stegvis implementation och felsökning, underlättas ditt arbetet stort om du använder byggverktyget \code{sbt} som finns installerat på skolans datorer (se även Appendix~\ref{appendix:build}). Lägg en fil med namnet \code{build.sbt} i katalogen där du jobbar, t.ex. \code{~/pgk/w06/lab}, med detta innehåll: \begin{Code} -scalaVersion := "3.0.1" +scalaVersion := "3.1.3" \end{Code} Då kan du i ett eget terminalfönster köra igång \code{sbt} och sedan kommandot \code{~compile}. Då kompileras din ändrade kod om automatiskt varje gång du sparar en scala-fil i denna katalog. \begin{REPLnonum} @@ -280,15 +280,14 @@ \Subtask Under laborationen är det smidigt att kunna representera flyttbara positioner i ett pixelfönster. Implementera case-klassen \code{Pos} i ett nytt terminalfönster enligt nedan så att den fungerar enligt efterföljande REPL-tester. \scalainputlisting[basicstyle=\ttfamily\fontsize{11}{13}\selectfont]{../workspace/w06_blockbattle/Pos.scala} -Om du använder \code{sbt} hamnar den kompilerade koden i \code{target/scala-3.0.1/classes}. Testa så att \code{Pos} fungerar med hjälp av REPL enligt nedan: +Testa så att \code{Pos} fungerar med hjälp av REPL enligt nedan: \begin{REPL} -> cd ~/pgk/w06/lab -> scala -cp target/scala-3.0.1/classes +sbt> console scala> blockbattle.Pos(1,2) val res0: blockbattle.Pos = Pos(1,2) -scala> import blockbattle._ +scala> import blockbattle.* scala> val p = Pos(1,2) val p: blockbattle.Pos = Pos(1,2) @@ -297,7 +296,7 @@ val res1: blockbattle.Pos = Pos(1,3) \end{REPL} -\Subtask Under laborationen är det smidigt att kunna representera vilka tangenter som motsvarar de olika riktningar som en användare kan styra sin mullvad. Gör klart case-klassen \code{KeyControl} enligt nedan så att den fungerar enligt efterföljande REPL-tester. +\Subtask Under laborationen är det smidigt att kunna representera vilka tangenter som motsvarar de olika riktningar som en användare kan styra sin mullvad i. Gör klart case-klassen \code{KeyControl} enligt nedan så att den fungerar enligt efterföljande REPL-tester. Metoden \code{direction} ska ge ett delta-steg i rätt \code{(x, y)}-riktning för ett givet tangentnamn. Metoden \code{has} ska ge \code{true} om tangentnamnet finns i någon av de fyra riktningstangenterna i denna denna \code{KeyControl}-instans, annars \code{false}. \scalainputlisting[basicstyle=\ttfamily\fontsize{10}{12}\selectfont]{../workspace/w06_blockbattle/KeyControl.scala} % \begin{CodeSmall} % case class KeyControl(left: String, right: String, up: String, down: String){ @@ -307,7 +306,7 @@ % } % \end{CodeSmall} \begin{REPL} -scala> import blockbattle._ +scala> import blockbattle.* scala> val kc1 = KeyControl(right="d",left="a",up="w",down="s") val kc1: blockbattle.KeyControl = KeyControl(a,d,w,s) @@ -374,11 +373,11 @@ \Subtask Under laborationen behöver du en klass \code{blockbattle.BlockWindow} som med hjälp av \code{introprog.PixelWindow} erbjuder blockgrafik. Varje instans av \code{BlockWindow} ska ha ett attribut som refererar till en \code{PixelWindow}-instans. Detta kallas \textbf{aggregering} \Eng{aggregation}.\footnote{\url{https://en.wikipedia.org/wiki/Object\_composition\#Aggregation}} -För att det ska gå att kompilera och testa din \code{BlockWindow}-klass behöver du ha \code{introprog}-paketet på classpath. Med byggverktyget \code{sbt} hamnar alla jar-filer som ligger i katalogen \texttt{lib} automatiskt på classpath när du gör \code{compile}, \code{run}, etc. +För att det ska gå att kompilera och testa din \code{BlockWindow}-klass behöver du ha \code{introprog}-paketet på classpath. Med byggverktyget \code{sbt} hamnar alla jar-filer som ligger i katalogen \texttt{lib} automatiskt på classpath när du gör \code{compile}, \code{run}, etc. Skapa katalogen \code{lib} och ladda ner filen \url{https://fileadmin.cs.lth.se/introprog.jar} via din webbläsare eller med kommandot \code{curl} nedan (notera att det är stora bokstaven \code{O} och inte en nolla i optionen \code{-sLO}): \begin{REPLnonum} > mkdir lib -> wget -O lib/introprog.jar http://cs.lth.se/pgk/lib +> curl -sLO https://fileadmin.cs.lth.se/introprog.jar > sbt sbt> ~compile \end{REPLnonum} diff --git a/compendium/modules/w06-patterns-exercise.tex b/compendium/modules/w06-patterns-exercise.tex index 06c078528..34a848996 100644 --- a/compendium/modules/w06-patterns-exercise.tex +++ b/compendium/modules/w06-patterns-exercise.tex @@ -1024,9 +1024,7 @@ \Task \label{task:polynomial} \what~ Med hjälp av koden nedan, kan man göra följande: \begin{REPL} -scala> :pa polynomial.scala - -scala> import polynomial._ +scala> import polynomial.* scala> Const(1) * x res0: polynomial.Term = x @@ -1039,9 +1037,9 @@ \end{REPL} -\Subtask Förklara vad som händer ovan genom att studera koden för \code{object polynomial} nedan i filen \code{polynomial.scala}.\footnote{Koden finns även här:\\ \href{https://github.com/lunduniversity/introprog/tree/master/compendium/examples/polynomial}{github.com/lunduniversity/introprog/tree/master/compendium/examples/polynomial}} +\Subtask Förklara vad som händer ovan genom att studera koden nedan\footnote{Koden finns även här:\\ \href{https://github.com/lunduniversity/introprog/tree/master/compendium/examples/polynomial}{github.com/lunduniversity/introprog/tree/master/compendium/examples/polynomial}}. -\scalainputlisting[numbers=left,basicstyle=\ttfamily\fontsize{10}{12}\selectfont]{examples/polynomial/polynomial.scala} +\scalainputlisting[numbers=left,basicstyle=\ttfamily\fontsize{10.5}{13}\selectfont]{examples/polynomial/polynomial.scala} \Subtask Bygg vidare på \code{object polynomial} och implementera addition mellan olika termer. diff --git a/compendium/modules/w06-patterns-lab.tex b/compendium/modules/w06-patterns-lab.tex index 073633bdc..6d8346e71 100644 --- a/compendium/modules/w06-patterns-lab.tex +++ b/compendium/modules/w06-patterns-lab.tex @@ -131,7 +131,7 @@ \subsection{Tips och förslag} % val leftPlayerName: String = "LEFT", % val rightPlayerName: String = "RIGHT" % ) { -% import Game._ // direkt tillgång till namn på medlemmar i kompanjon +% import Game.* // direkt tillgång till namn på medlemmar i kompanjon % % val window = new BlockWindow(windowSize, windowTitle, blockSize) % val leftMole = ??? diff --git a/compendium/modules/w07-sequences-lab.tex b/compendium/modules/w07-sequences-lab.tex index 2d66d3f41..6db242d62 100644 --- a/compendium/modules/w07-sequences-lab.tex +++ b/compendium/modules/w07-sequences-lab.tex @@ -21,7 +21,7 @@ \subsection{Bakgrund}\label{knuth-shuffle} Denna uppgift handlar om kortblandning. Att blanda kort så att varje möjlig permutation (ordning som korten ligger i) är lika sannolik är icke-trivialt; en osystematisk blandning leder till en skev fördelning. -Givet en bra slumpgenerator går det att blanda en kortlek genom att lägga alla kort i en hög och sedan ta ett slumpvist kort från högen och lägga det överst i leken, tills alla kort ligger i leken. Fisher-Yates-algoritmen\footnote{\href{https://en.wikipedia.org/wiki/Fisher\%E2\%80\%93Yates_shuffle}{https://en.wikipedia.org/wiki/Fisher\%E2\%80\%93Yates\_shuffle}} (även kallad Knuth-shuffle), fungerar på det sättet. Här benämner vi denna algoritm SHUFFLE. Den återfinns i pseudokod nedan: +Givet en bra slumpgenerator går det att blanda en kortlek genom att lägga alla kort i en hög och sedan ta ett slumpvist kort från högen och lägga det överst i leken, tills alla kort ligger i leken. Fisher-Yates-algoritmen\footnote{\href{https://en.wikipedia.org/wiki/Fisher\%E2\%80\%93Yates_shuffle\#The_modern_algorithm}{https://en.wikipedia.org/wiki/Fisher\%E2\%80\%93Yates\_shuffle\#The\_modern\_algorithm}} (även kallad Knuth-shuffle), fungerar på det sättet. Här benämner vi denna algoritm SHUFFLE. Den återfinns i pseudokod nedan. Notera speciellt att den övre gränsen för $r$ inluderar $i$. \begin{algorithm}[H] \SetKwInOut{Input}{Indata} @@ -29,7 +29,7 @@ \subsection{Bakgrund}\label{knuth-shuffle} \Input{Array $xs$ med $n$ st värden som ska blandas ''på plats''} \Output{$xs$ med sina värden omflyttade i slumpmässig ordning} \For{$i \leftarrow (n - 1)$ \KwTo $0$}{ - $r \leftarrow$ slumptal mellan $0$ och $i$ \\ + dra slumptal $r$ så att $0 <= r <= i$ \\ byt plats på $xs(i)$ och $xs(r)$ % $temp \leftarrow xs(i)$ \\ % $xs(i) \leftarrow xs(r)$ \\ diff --git a/compendium/modules/w08-matrices-lab.tex b/compendium/modules/w08-matrices-lab.tex index 9e0836d4b..8fcb6d259 100644 --- a/compendium/modules/w08-matrices-lab.tex +++ b/compendium/modules/w08-matrices-lab.tex @@ -89,7 +89,7 @@ \subsection{Valbara krav -- välj minst ett} val OverPopulated = java.awt.Color.red // rödklämd av trängsel val WillBeBorn = new java.awt.Color(40, 0, 0) // snart levande \end{CodeSmall} -Ge \code{LifeWindow} en klassparameter \code{isMultiColor} som styr om det blir mångfärgade celler eller om det bara finns rosa och svart som i grundkraven. +Ge dessutom \code{LifeWindow} en klassparameter \code{isMultiColor} som gör det möjligt att välja om det ska bli mångfärgade celler eller om det bara ska finnas rosa och svart som i grundkraven. \item Om man trycker på \code{S} för \emph{Save} ska \code{introprog.Dialog.file("Save Life")} visas och, om användaren inte trycker \Button{Cancel}, det aktuella livet sparas med hjälp av \code{introprog.IO.saveString} i en textfil via metoden \code{toString} i \code{Life}. @@ -185,7 +185,7 @@ \subsection{Tips och förslag} % import introprog.PixelWindow.Event % % class LifeWindow(rows: Int, cols: Int){ -% import LifeWindow._ // importera konstanter för cellstorlek, färger, etc. +% import LifeWindow.* // importera konstanter för cellstorlek, färger, etc. % % var life = Life.empty(rows, cols) % val window: PixelWindow = ??? diff --git a/compendium/modules/w09-setmap-exercise.tex b/compendium/modules/w09-setmap-exercise.tex index 66e58233e..cdf7a248a 100644 --- a/compendium/modules/w09-setmap-exercise.tex +++ b/compendium/modules/w09-setmap-exercise.tex @@ -469,9 +469,9 @@ \end{Code} Testa tabellerna i REPL. -\Subtask Spara ner data i en textfil \code{europa.txt}. Läsa in data från filen med metoden \code{Source.fromFile(filnamn, teckenkodning)} på liknande sätt som med \code{fromURL} ovan. Om du kör i en Linux-terminal kan du enkelt ladda ner en fil så här: +\Subtask Spara ner data i en textfil \code{europa.txt}. Läsa in data från filen med metoden\\ \code{Source.fromFile(filnamn, teckenkodning)} på liknande sätt som med \code{fromURL} ovan. Om du kör i en Linux-terminal kan du enkelt ladda ner en fil så här (notera att det är stora bokstaven \code{O} och inte en nolla i optionen \code{-sLO}): \begin{REPLnonum} -> wget https://fileadmin.cs.lth.se/pgk/europa.txt +> curl -sLO https://fileadmin.cs.lth.se/pgk/europa.txt \end{REPLnonum} Skriv ut alla raderna i \code{europa.txt} med hjälp av \code{Source.fromFile} i REPL. diff --git a/compendium/modules/w11-context-exercise.tex b/compendium/modules/w11-context-exercise.tex index 66d3fa0bd..8276c8e8f 100644 --- a/compendium/modules/w11-context-exercise.tex +++ b/compendium/modules/w11-context-exercise.tex @@ -4,15 +4,14 @@ \ifPreSolution - \Exercise{\ExeWeekELEVEN}\label{exe:W11} -\TODO övningar på given using, extensionsmetoder, typklasser, Ordering etc. - \begin{Goals} -\item \TODO Fler mål här! -\item Känna till hur implicita sorteringsordningar används för grundtyperna och egendefinierade typer. -\item Känna till existensen av, funktionen hos, och relationen mellan klasserna \code{Ordering} och \code{Comparator}, samt \code{Ordered} och \code{Comparable}. +\item Kunna förklara vad en kontextparameter är. +\item Kunna förklara nyttan med kontextparametrar jämfört med en globala variabler och defaultargument vid lösning av konfigurationsproblemet. +%\item Känna till hur givna sorteringsordningar används för egendefinierade typer. +\item Kunna använda enkla kontextuella abstraktioner med \code{given} och \code{using}. +%\item Känna till existensen av, funktionen hos, och relationen mellan klasserna \code{Ordering} och \code{Comparator}, samt \code{Ordered} och \code{Comparable}. \end{Goals} @@ -30,100 +29,527 @@ \fi - -\WHAT{Användning av givna värden.} +\WHAT{Kontextparameter.} \QUESTBEGIN -\Task \what~ \TODO ... +\Task \what~Deklarera följande funktioner som tar ett heltal som kontextparameter. Skapa även en \code{given}-deklaration som erbjuder det givna heltalsvärdet noll: +\begin{REPLnonum} +scala> def f(using i: Int) = i + 1 -\Subtask \TODO ... +scala> def g(x: Int)(using y: Int) = x + y +\end{REPLnonum} +\Subtask Anropa funktionerna \code{f} och \code{g} med ett explicit givet argument som skiljer sig från det givna heltalsvärdet med hjälp av \code{using} i anropet. Vad händer om du utelämnar \code{using}? +\Subtask Anropa funktionerna \code{f} och \code{g} utan att ange \code{using}-argument. Förklara vad som händer. + +\Subtask Går det att blanda vanliga parametrar och kontextparametrar i samma parameterlista? Om inte vad händer? \SOLUTION +\TaskSolved \what + +\SubtaskSolved +\begin{REPLnonum} +scala> given Int = 0 +val res0: Int = 83 + +scala> f(using 41) +val res1: Int = 42 + +scala> g(41)(using 42) +val res2: Int = 83 +\end{REPLnonum} +\noindent +Om man glömmer \code{using} vid explicit kontextargument blir det kompileringsfel. Kompilatorn blir ''förvirrad'' och tror att du försöker ge ett ''vanligt'' argument till en (i detta fallet) icke-existerande ''vanlig'' parameterlista. +\begin{REPLnonum} +scala> f(41) +-- [E050] Type Error: ---------------------------------------------- +1 |f(41) + |^ + |method f does not take more parameters + | + | longer explanation available when compiling with `-explain` +1 error found + +scala> :setting -explain + +scala> f(41) +-- [E050] Type Error: ---------------------------------------------- +1 |f(41) + |^ + |method f does not take more parameters + |----------------------------------------------------------------- + | Explanation (enabled by `-explain`) + |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | You have specified more parameter lists than defined in the + method definition(s). + ----------------------------------------------------------------- + +scala> g(41)(42) +-- [E050] Type Error: ---------------------------------------------- +1 |g(41)(42) + |^^^^^ + |method g does not take more parameters + |----------------------------------------------------------------- + | Explanation (enabled by `-explain`) + |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | You have specified more parameter lists than defined in the + method definition(s). + ----------------------------------------------------------------- +\end{REPLnonum} +Det är inte vanligt att ange \code{using}-parametrar explicit; det vanligaste är att låta kompilatorn framkalla ett givet värde. + +\SubtaskSolved Det givna värdet \code{0} binds till motsvarande kontextparameter, som ska vara deklarerad i en egen parameterlista som börjar med \code{using}. +\begin{REPLnonum} +scala> f +val res3: Int = 1 + +scala> g(42) +val res4: Int = 42 +\end{REPLnonum} + +\SubtaskSolved Nej, det blir kompileringsfel om man försöker blanda vanliga parametrar och kontextparametrar i en och samma parameterlista: +\begin{REPLnonum} +scala> def h(i: Int, using j: Int) = i + j +-- [E040] Syntax Error: --------------------------------------------- +1 |def h(i: Int, using j: Int) = i + j + | ^ + | ':' expected, but identifier found +\end{REPLnonum} +Det är ett medvetet val att kräva separata parameterlistor, så att det inte ska uppstå förvirring om huruvida en vanlig parameter eller kontextparameter avses. + +\QUESTEND + + + +\WHAT{Flera olika givna värden i lokal kontext.} + +\QUESTBEGIN + +\Task \what~Olika värden beroende på kontext. +\begin{Code} +case class Delta(value: Int) +object Delta: + given default: Delta = Delta(1) + +def inc(x: Int)(using dx: Delta) = x + dx.value + +object Context1: + val a = inc(1) + +object Context2: + given Delta = Delta(42) + val a = inc(1) + +\end{Code} + +\Subtask Vilket värde har \code{Context1.a}? + +\Subtask Vilket värde har \code{Context2.a}? + +\Subtask Förklara vad som händer. + +\SOLUTION \TaskSolved \what -\SubtaskSolved \TODO ... +\SubtaskSolved 2 +\SubtaskSolved 43 + +\SubtaskSolved När kompilatorn försöker framkalla ett givet värde att automatiskt använda som argument till \code{using}-parametern \code{dx}, så letar den i den kontext som är närmast anropet först. Om det finns ett givet värdet i kompanjonsobjektet för parametertypen så tar kompilatorn detta i sista hand, om inget annat givet värde hittas närmare anropet. \QUESTEND -\WHAT{Typklasser och kontextparametrar.} + + +\WHAT{Lösning på konfigurationsproblemet med hjälp av givna värden.} \QUESTBEGIN -\Task \what~ I Scala finns möjligheter till avancerad funktionsprogrammering med s.k. \textbf{typklasser}, som definierar generella beteenden som fungerar för befintliga typer utan att implementationen av dessa befintliga typer behöver ändras. Vi nosar i denna uppgift på hur implicita argument kan användas för att skapa typklasser, illustrerat med hjälp av implicita ordningarna, som är en typisk och användbar tillämpning av konceptet typklasser. +\Task \what~ Antag att vi vill kunna konfigurera beteendet hos en funktion för att göra den mer flexibel. Nedan visas tre principiellt olika sätt att göra detta på för en funktion \code{greet} som skriver ut en hälsning: 1) en globalt åtkomlig variabel, 2) defaultargument, samt 3) kontextuell abstraktion med \code{given} och \code{using}. + +\begin{Code} +object GlobalVar: + case class GreetConfig(greeting: String, receiver: String) + object GreetConfig: + val default = GreetConfig(greeting = "Hello", receiver = "World") + var config = default + + def greetMsg = + s"${GreetConfig.config.greeting} ${GreetConfig.config.receiver}!" + +object DefaultArgs: + case class GreetConfig(greeting: String, receiver: String) + object GreetConfig: + val default = GreetConfig(greeting = "Hello", receiver = "World") + + def greetMsg(config: GreetConfig = GreetConfig.default) = + s"${config.greeting} ${config.receiver}!" + +object GivenVal: + case class GreetConfig(greeting: String, receiver: String) + object GreetConfig: + given default: GreetConfig = GreetConfig("Hello", "World") + + def greetMsg(using g: GreetConfig) = s"${g.greeting} ${g.receiver}" +\end{Code} + +\Subtask Skriv kod som testar de olika varianterna ovan. Visa speciellt hur du kan använda default-konfigurationen och därefter ge en konfiguration som skiljer sig från \code{default}. -\Subtask \emph{Implicit parameter och implicit värde.} Med nyckelordet \code{implicit} framför en parameter öppnar man för möjligheten att låta kompilatorn ge argumentet ''automatiskt'' om den kan hitta ett värde med passande typ som också är deklarerat med \code{implicit}, så som visas nedan. +\Subtask Vad är för- och nackdelar med de olika varianterna ovan? Diskutera speciellt vilken/vilka lösningar som medger flera lokala konfigurationer utan att de påverkar varandra. + +\Subtask Förklara vad som händer vid anrop av \code{summon[GivenVal.GreetConfig]}. + +\Subtask Vad händer om du försöker framkalla ett givet värde för en typ som inte har något sådant? + +\Subtask Måste det givna värdet vara unikt? + +\SOLUTION + + +\TaskSolved \what\\ + +\noindent Nedan visas test av de tre olika lösningarna som givits i uppg. \SubtaskSolved + +\noindent Efter varje test diskuteras tillhörande för- och nackdelar, som efterfrågas i uppg. \SubtaskSolved + +\begin{Code} +def testGlobalVar(useDefault: Boolean = true) = + import GlobalVar.* + if useDefault then println(greetMsg) else + GreetConfig.config = GreetConfig("Godmorgon", "världen") + println(greetMsg) +\end{Code} +Eftersom \code{config} här är en förändringsbar variabel, så kan en ändring på ett ställe påverka helt andra delar av programmet, vilket ibland kan vara en fördel, men ofta en nackdelen eftersom det kan vara svårt att förstå vad som händer bara genom att läsa en enskild del av programmet -- en förändring av \code{config} kan ju ske varsomhelst. Det är lätt att glömma ändra till baka till default-värdet, om det är det som förväntas. +\begin{REPL} +scala> testGlobalVar(); testGlobalVar(false); testGlobalVar() +Hello World! +Godmorgon världen! +Godmorgon världen! +\end{REPL} + +\begin{Code}[numbers=left] +def testDefaultArgs(useDefault: Boolean = true) = + import DefaultArgs.* + if useDefault then println(greetMsg()) else + println(greetMsg(GreetConfig("Godmorgon","världen"))) +\end{Code} +Här sker ingen tillståndsförändring och default-användning är enkel, men det går inte enkelt att göra avsteg från default som gäller i en lokal kontext; vid \emph{varje} enskilt anrop behöver du explicit ange alla de argument som inte ska vara default, så som visas på rad 4 ovan. Ändring av default har bara lokal påverkan. Om alla argument ska följa default, så gäller det att inte glömma anropa med tomt parentespar: \code{greetMsg()}. (Vad händer annars?) \begin{REPL} -scala> def add(x: Int)(implicit y: Int) = x + y -scala> add(1)(2) +scala> testDefaultArgs(); testDefaultArgs(false); testDefaultArgs() +Hello World! +Godmorgon världen! +Hello World! +\end{REPL} +Med kontextparametrar är flexibiliteten större; \code{using}-parametrar låter användaren själv styra vad som gäller i olika sammanhang och själva anropet blir enkelt oavsett om det är default-värdet eller andra, i den lokala kontexten, givna värden som önskas. Ändring av default har bara lokal påverkan, men den har påverkan på godtyckligt många anrop i den lokala kontexten -- argument som skiljer sig kan alltså vara givna en gång utan att behöva upprepas vid varje anrop. Vid anrop där man vill låta kompilatorn framkallar givna värden för kontextparametern ska inga parenteser användas, och anropen bli därmed korta och enkla. +\begin{Code} +def testGivenVal(using g: GivenVal.GreetConfig) = println(g.greetMsg) +\end{Code} + +\begin{REPL} +scala> testGivenVal +Hello World + +scala> def localContext = + import GivenVal.* + given GreetConfig = GreetConfig("Godmorgon","världen") + testGivenVal + +scala> localContext +Godmorgon världen + +scala> testGivenVal +Hello World +\end{REPL} + + +\SubtaskSolved Kompilatorn framkallar ett givet värde i den lokala kontexten: +\begin{REPL} +scala> summon[GivenVal.GreetConfig] +val res0: GivenVal.GreetConfig = GreetConfig(Hello,World) +\end{REPL} +Kompilatorn följer denna prioritetsordning i sökandet efter ett unikt givet värde: +\begin{enumerate}[nolistsep,noitemsep] +\item \textbf{Explicita} argument till kontextparametrar märkta med \code{using} +\item \code{given} och \code{import given ...} i aktuell namnrymd \Eng{current scope} +\item \code{given}-värden i \textbf{kompanjonsobjekt} för den använda typen. +\end{enumerate} +Om flera givna värden kan framkallas för typer som ingår i en gemensam arvshierarki så väljer kompilatorn det givna värdet som är av den \emph{mest specifika} typen.\\ + +\SubtaskSolved Det blir kompileringsfel om kompilatorn inte hittar ett givet värde för den typ som avses. + +\begin{REPL} +scala> summon[Long] +-- Error: ---------------------------------------------------------------- +1 |summon[Long] + | ^ + | no given instance of type Long was found for parameter x of + method summon in object Predef +1 error found +\end{REPL} + +\SubtaskSolved Ja! Det får \emph{inte} vara tvetydigt vilket givet värde som ska framkallas: +\begin{REPL} +scala> def tvetydigt = + | given a: Int = 42 + | given b: Int = 43 + | summon[Int] + | +-- Error: ------------------------------------------------------------------ +4 | summon[Int] + | ^ + |ambiguous given instances: both given instance b and given instance a + |match type Int of parameter x of method summon in object Predef +1 error found + +\end{REPL} +Läs mer om kontexuella abstraktioner här:\\\url{https://docs.scala-lang.org/scala3/reference/contextual/} + + +\QUESTEND + + +\ExtraTasks + + +\WHAT{Kontextparameter och givet värde.} + +\QUESTBEGIN + +\Task \what~Prova nedan i REPL. +\begin{REPL} +scala> def add(x: Int)(using y: Int) = x + y +scala> add(1)(using 2) scala> add(1) -scala> implicit val ngtNamn = 42 +scala> given ngtNamn = 42 scala> add(1) \end{REPL} -Vad blir felmeddelandet på rad 3 ovan? Varför fungerar det på rad 5 utan fel? +\Subtask Vad blir felmeddelandet på rad 3 ovan? -\Subtask \emph{Typklasser.} Genom att kombinera koncepten implicita värden, generiska klasser och implicita parametrar får man möjligheten att göra typklasser, så som \code{CanCompare} nedan, som vi kan få att fungera för befintliga typer utan att de behöver ändras. +\Subtask Varför fungerar det på rad 5 utan fel? -Vad händer nedan? Vilka rader ger felmeddelande? Varför? +\Subtask Definiera och testa en motsvarande funktion \code{sub} som kan subtrahera ett givet värde. + +\SOLUTION + +\TaskSolved \what + +\SubtaskSolved \begin{REPL} -scala> trait CanCompare[T] { def compare(a: T, b: T): Int } -scala> def sort2[T](a: T, b: T)(implicit cc: CanCompare[T]): (T, T) = - if (cc.compare(a, b) > 0) (b, a) else (a, b) -scala> sort2(42, 41) -scala> implicit object intComparator extends CanCompare[Int]{ - override def compare(a: Int, b: Int): Int = a - b - } -scala> sort2(42, 41) -scala> sort2(42.0, 41.0) +scala> add(1) +-- Error: ------------------------------------------------------------------ +1 |add(1) + | ^ + | no given instance of type Int was found for parameter y of method add +1 error found \end{REPL} -\Subtask Definiera ett implicit objekt som gör så att \code{sort2} fungerar för värden av typen \code{Double}. +\SubtaskSolved Nu finns ett givet värde som kompilatorn automatiskt kan fylla i på platsen vid anropet. + +\SubtaskSolved \code{def sub(x: Int)(using y: Int) = x - y} + +\QUESTEND + +\AdvancedTasks %%%%%%%%%%% + + +\WHAT{Varians och typgränser.} + +\QUESTBEGIN + +\Task \what~ Koden nedan är en modell av husdjur med följande innebörd: Husdjur kan vara friska eller sjuka och föds i normalfallet friska. Det kan finnas många katter och hundar, vilka alla är olika slags husdjur. + +\begin{Code} +trait Pet(var isHealthy: Boolean = true) +class Cat extends Pet() +class Dog extends Pet() + +\end{Code} + +\Subtask Förändra koden nedan så att efterföljande REPL-sats \emph{inte} ger kompileringsfel? +\begin{Code} +case class Box[A](x: A) +\end{Code} +\begin{REPLnonum} +scala> val b: Box[Any] = Box[Cat](Cat()) +\end{REPLnonum} + +\Subtask Prova nedan i REPL och förklara vad som händer. +\begin{REPLnonum} +scala> val v: Vector[Pet] = Vector[Cat](Cat()) + +scala> val s: Set[Pet] = Set[Cat](Cat()) -\Subtask Definiera ett implicit objekt som gör så att \code{sort2} fungerar för värden av typen \code{String}. +scala> :settings -explain +scala> val s: Set[Pet] = Set[Cat](Cat()) +\end{REPLnonum} +\emph{Ledtråd:} I Scalas standardbibliotek så är ärver \code{Set[T]} funktionstypen \code{T => Boolean} som är deklarerad kontravariant i sin inparameter. + +\Subtask Det ska finnas veterinärer som kan behandla husdjur och göra dem friska. Varför fungerar inte nedan kod? Är det ett kompileringsfel eller körtidsfel? + +\begin{Code} +class Vet[-A]: + def treat(x: A): Unit = x.isHealthy = true +\end{Code} + +\Subtask Inför en typgräns i veterinärens typparametern som åtgärdar felet. + +\Subtask Skriv valfri kod som visar 1) att kompilatorn tillåter kattveterinärer att behandla katter men 2) förhindrar att kattveterinärer får behandla godtyckliga husdjur och att 3) en veterinär som har komptens att behandla godtyckliga husdjur kan behandla både katter och hundar. Förklara varför kompilatorn tillåter/förhindrar detta. \SOLUTION \TaskSolved \what -\SubtaskSolved --- +\SubtaskSolved Gör lådan flexibel i sin typparameter med ett \code{+} före typparametern enligt nedan. +\begin{Code} +case class Box[+A](x: A) +\end{Code} +Kompilatorn tillämpar reglerna för kovarians eftersom typparametern har ett plustecken framför sig: \code{Box[Cat]} är en suptyp till \code{Box[Any]} om \code{Cat} är en subtyp till \code{Any}, vilket den ju är eftersom alla typer är subtyp till \code{Any}. +\SubtaskSolved Förklaringen till beteendet har med olika varians att göra: +\begin{itemize} + \item Samlingen \code{Vector} är kovariant och därmed flexibel i sin typparameter (liksom andra oföränderliga sekvenser i Scalas standardbibliotek). Kompilatorn betraktar därmed \code{Vector[Cat]} som en subtyp till \code{Vector[Pet]} eftersom \code{Cat} är en subtyp till \code{Pet}. På platser i koden där en \code{Vector[Pet]} krävs så anses \code{Vector[Cat]} överensstämma med \Eng{conforms to} \code{Vector[Pet]} och får därmed duga på dessa platser. + \item En mängd har en apply-metod från elemttypen till \code{Boolean} som ger innehållstest. Av det skälet har man låtit \code{Set[T]} ärva \code{Function1[T, Boolean]} som är deklarerad kontravariant i \code{T}, så att en mängd kan användas där en \code{T => Boolean} förväntas. Även om det skulle vara praktiskt om Set[T] vore kovariant i \code{T}, i likhet med \code{Vector}, \code{List}, \code{Seq} etc, så kan inte \code{T} vara både kovariant och kontravariant på en och samma gång. Man har därför valt att göra \code{Set} invariant och därmed är mängder ej flexibla i sin typparameter. \code{Set[Cat]} är alltså \emph{inte} en subtyp till \code{Set[Pet]} \emph{även} om \code{Cat} är en subtyp till \code{Pet}, vilket ger kompileringsfel i uppgiftens exempel. + Se även \url{https://stackoverflow.com/questions/676615/why-is-scalas-immutable-set-not-covariant-in-its-type} + \item Med \code{:settings -explain} ger kompilatorn en längre utskrift som förklarar den bevisföring som skedde under kompileringens typkontroll. +\end{itemize} -\SubtaskSolved --- -\SubtaskSolved -Tänk på att det fortfarande måste returneras en Int. +\SubtaskSolved Det blir kompileringsfel då metoden \code{isHealthy} ej existerar för godtycklig typ. + +\SubtaskSolved Lägg till en övre gräns som garanterar att metoden \code{isHealthy} finns för alla typer som kan bindas till typparametern \code{A}: +\begin{Code} +class Vet[-A <: Pet]: + def treat(x: A): Unit = x.isHealthy = true +\end{Code} +Kompilatorn garanterar alltså att typparametern \code{A} är ''mindre än eller lika med'' \code{Pet}. +\SubtaskSolved Veterinären \code{Vet} är flexibel i sin typparameter och minustecknet anger kontravarians och därmed att \code{Vet[Pet]} är en subtyp till \code{Vet[Cat]} då \code{Cat} är en subtyp till \code{Pet}. Detta kan demonstreras med nedan exempel: +\begin{REPL} +scala> val pinkPanther = Cat() +val pinkPanther: Cat = Cat@33e7ece5 -\SubtaskSolved -Undersök i Javas API hur metoden \code{compareTo} är implementerad för strängar. +scala> val somePet: Pet = Cat() +val somePet: Pet = Cat@57f1cb96 -\QUESTEND +scala> val catVet = Vet[Cat]() +val catVet: Vet[Cat] = Vet@1060e784 + +scala> pinkPanther.isHealthy = false + +scala> catVet.treat(pinkPanther) + +scala> pinkPanther.isHealthy +val res2: Boolean = true +scala> somePet.isHealthy = false +scala> catVet.treat(somePet) +-- [E007] Type Mismatch Error: -------------- +1 |catVet.treat(somePet) + | ^^^^^^^ + | Found: (somePet : Pet) + | Required: Cat +scala> val powerVet = Vet[Pet]() +val powerVet: Vet[Pet] = Vet@2eb90ae9 +scala> pinkPanther.isHealthy = false -\WHAT{Användning av implicit ordning.} +scala> powerVet.treat(pinkPanther) + +scala> pinkPanther.isHealthy +val res3: Boolean = true + +scala> val pluto = Dog() +val pluto: Dog = Dog@6f27db5d + +scala> pluto.isHealthy = false + +scala> powerVet.treat(pluto) + +scala> pluto.isHealthy +val res4: Boolean = true + +\end{REPL} + + +\QUESTEND + + + + +\WHAT{Typklasser och kontextparametrar.} \QUESTBEGIN -\Task \label{task:implicit-ordering} \what~ Vi ska nu göra \code{isSorted} från uppgift \ref{task:isSorted} mer generellt användbar genom att möjliggöra att implicita ordningsfunktioner finns tillgängliga för olika typer. +\Task \what~ I Scala finns möjligheter till avancerad funktionsprogrammering med s.k. \textbf{typklasser} (ä.k. \emph{ad hoc polymorfism}). En typklass definierar generella beteenden som fungerar för godtyckliga befintliga typer utan att implementationen av dessa behöver ändras. Vi nosar i denna uppgift på hur kontextuella abstraktioner kan användas för att skapa typklasser i Scala, illustrerat med hjälp av givna ordningarna vid sortering. + +Genom att kombinera koncepten givna värden, generiska klasser och kontextparametrar får man möjligheten till ad hoc polymorfism, exemplifierat med typklassen \code{CanCompare} nedan, som vi kan få att fungera för befintliga typer \emph{utan} att de behöver ändras. Speciellt så har vi ju inte möjligheten att lägga till metoder på befintliga typer i standardbiblioteket, efter som det inte är våran egen kod. + + +\Subtask +Vad händer nedan? Vilka rader ger felmeddelande? Varför? + +\begin{REPL} +scala> trait CanCompare[T]: + def compare(a: T, b: T): Int + +scala> def sort[T](a: T, b: T)(using cc: CanCompare[T]): (T, T) = + if cc.compare(a, b) > 0 then (b, a) else (a, b) + +scala> sort(42, 41) + +scala> given intComparator: CanCompare[Int] with + override def compare(a: Int, b: Int): Int = a - b + +scala> sort(42, 41) + +scala> sort(42.0, 41.0) +\end{REPL} + +\Subtask Definiera ett givet värde som gör så att \code{sort} fungerar för värden av typen \code{Double}. + +\Subtask Definiera ett givet värde som gör så att \code{sort} fungerar för värden av typen \code{String}. \emph{Tips:} Du har nytta av de befintliga jämförelseoperatorerna på strängar, men tänk på att \code{compare} fortfarande måste returnera ett heltal även vid jämförelse av strängar. + + +\SOLUTION + + +\TaskSolved \what + +\SubtaskSolved \TODO + + +\SubtaskSolved \TODO + + +\SubtaskSolved \TODO + +\QUESTEND + + + + + +\WHAT{Användning av given ordning.} -\Subtask Med signaturen \code{isSorted(xs: Vector[Int]): Boolean} så -fungerar sorteringstestet bara för samlingar av typen \code{Vector[Int]}. +\QUESTBEGIN + +\Task \label{task:implicit-ordering} \what~ Vi ska nu skapa en funktion \code{isSorted} som är generellt användbar genom att göra givna ordningsfunktioner tillgängliga för olika typer. Funktionen \code{def isSorted(xs: Vector[Int]): Boolean = ???} fungerar bara för samlingar av typen \code{Vector[Int]}. Om vi i stället använder -\code{isSorted(xs: Seq[Int]): Boolean} fungerar den för alla samlingar med heltal, även \code{Array} och \code{List}. Testa nedan funktion i REPL med heltalssekvenser av olika typ. +\code{def isSorted(xs: Seq[Int]): Boolean = ???} fungerar den för olika samlingar med heltal, även \code{Vector} och \code{List}. + +\Subtask Testa nedan funktion i REPL med heltalssekvenser av olika typ. \begin{Code} def isSorted(xs: Seq[Int]): Boolean = xs == xs.sorted \end{Code} @@ -133,33 +559,33 @@ scala> def isSorted[T](xs: Seq[T]): Boolean = xs == xs.sorted \end{REPLnonum} -\Subtask Vi vill gärna att \code{isSorted} ska fungera för godtyckliga typer T som har en ordningsdefinition. Detta kan göras med nedan funktion där typparametern \code{[T:Ordering]} betyder att \code{isSorted} är definierad för alla samlingar där typen \code{T} har en implicit ordning \code{Ordering[T]}. Speciellt gäller detta för alla grundtyperna \code{Int}, \code{Double}, \code{String}, etc., som alla har implicit tillgänglig \code{Ordering[Int]} etc. +\Subtask Vi vill gärna att \code{isSorted} ska fungera för godtyckliga typer T som har en ordningsdefinition. Detta kan göras med nedan funktion där den speciella typparametern \code{[T:Ordering]} betyder att \code{isSorted} är definierad för alla samlingar där typen \code{T} har en given ordning \code{Ordering[T]}. Speciellt gäller detta för alla grundtyperna \code{Int}, \code{Double}, \code{String}, etc., som alla har specifika implementationer av typklassen \code{Ordering}. \begin{Code} def isSorted[T:Ordering](xs: Seq[T]): Boolean = xs == xs.sorted \end{Code} Testa metoden ovan i REPL enligt nedan. \begin{REPL} scala> isSorted(Vector(1,2,3)) -scala> isSorted(Array(1,2,3,1)) +scala> isSorted(List(1,2,3,1)) scala> isSorted(Vector("A","B","C")) scala> isSorted(List("A","B","C","A")) scala> case class Person(firstName: String, familyName: String) -scala> val persons = Vector(Person("Kim", "Finkodare"), Person("Robin","Fulhack")) +scala> val persons = Vector(Person("Kim", "Finkodare"), Person("Voldemort","Fulhackare")) scala> isSorted(persons) \end{REPL} Vad ger sista raden för felmeddelande? Varför? -\Subtask \emph{Implicita ordningar.} En typparameter på formen \code{[T:Ordering]} kallas kontextgräns \Eng{context bound} och föranleder kompilatorn att expandera funktionshuvudet för \code{isSorted} med en extra parameterlista som har en implicit parameter. I stället för att använda \code{[T:Ordering]} kan vi själva lägga till den implicita parametern som motsvarar kontextgränsen. Då får vi också tillgång till ett namn på den implicita ordningen och kan använda det namnet i funktionskroppen och anropa metoder som är medlemmar av typen \code{Ordering}. +\Subtask \emph{Implicita ordningar.} En typparameter på formen \code{[T:Ordering]} kallas kontextgräns \Eng{context bound} och föranleder kompilatorn att automatiskt expandera funktionshuvudet för \code{isSorted} med en kontextparameter. I stället för att använda \code{[T:Ordering]} kan vi själva lägga till en kontextparameter som motsvarar kontextgränsen. Då får vi också tillgång till ett namn, här nedan \code{ord}, på den implicita ordningen och kan använda det namnet i funktionskroppen och anropa metoder som är medlemmar av typklassen \code{Ordering}. (Namnet på kontextparametern kan också utelämnas, men då får vi istället gå omvägen via inbyggda funktionen \code{summon[T]} för att be kompilatorn leta upp den givna instansen för den typparameter som ges vid anropet.) \begin{CodeSmall} -def isSorted[T](xs: Seq[T])(implicit ord: Ordering[T]): Boolean = +def isSorted[T](xs: Seq[T])(using ord: Ordering[T]): Boolean = xs.zip(xs.tail).forall(x => ord.lteq(x._1, x._2)) \end{CodeSmall} Objekt av typen \code{Ordering} har jämförelsemetoder som t.ex. \code{lteq} (förk. \emph{less than or equal}) och \code{gt} (förk. \emph{greater than}). -Det finns fördefinierade implicita objekt \code{Ordering[T]} för alla grundtyper, alltså t.ex. \code{Ordering[Int]}, \code{Ordering[String]}, etc. +Det finns givna ordningar för alla grundtyper i standardbiblioteket, alltså t.ex. \code{Ordering[Int]}, \code{Ordering[String]}, etc. Testa så att kompilatorn hittar ordningen för samlingar med värden av några grundtyper. Kontrollera även enligt nedan att det fortfarande blir problem för egendefinierade klasser, t.ex. \code{Person} (detta ska vi råda bot på i uppgift \ref{task:custom-ordering}). \begin{REPL} scala> isSorted(Vector(1,2,3)) @@ -173,7 +599,7 @@ \Subtask \emph{Importera implicita ordningsoperatorer från en \code{Ordering}.} Om man gör import på ett \code{Ordering}-objekt får man tillgång till implicita konverteringar som gör att jämförelseoperatorerna fungerar. Testa nedan variant av \code{isSorted} på olika sekvenstyper och verifiera att \code{<=}, \code{>}, etc., nu fungerar enligt nedan. \begin{CodeSmall} -def isSorted[T](xs: Seq[T])(implicit ord: Ordering[T]): Boolean = { +def isSorted[T](xs: Seq[T])(given ord: Ordering[T]): Boolean = { import ord._ xs.zip(xs.tail).forall(x => x._1 <= x._2) } @@ -183,7 +609,7 @@ \SOLUTION -\TaskSolved \what --- +\TaskSolved \what --- \TODO \QUESTEND @@ -198,45 +624,35 @@ \Task \label{task:custom-ordering} \what~ -\Subtask Ett sätt att skapa en egen, specialanpassad ordning är att mappa dina objekt till typer som redan har en implicit ordning. Med hjälp av metoden \code{by} i objektet \code{scala.math.Ordering} kan man skapa ordningar genom bifoga en funktion \code{T => S} där \code{T} är typen för de objekt du vill ordna och \code{S} är någon annan typ, t.ex. \code{String} eller \code{Int}, där det redan finns en implicit ordning. +\Subtask Ett sätt att skapa en egen, specialanpassad ordning för dina egna klasser är att mappa dina objekt till typer som redan har en implicit ordning. Med hjälp av metoden \code{by} i objektet \code{scala.math.Ordering} kan man skapa ordningar genom att bifoga en funktion \code{T => S} där \code{T} är typen för de objekt du vill ordna och \code{S} är någon annan typ, t.ex. \code{String} eller \code{Int}, där det redan finns en given ordning. \begin{REPL} scala> case class Team(name: String, rank: Int) scala> val xs = Vector(Team("fnatic", 1499), Team("nip", 1473), Team("lumi", 1601)) scala> xs.sorted // Hur lyder felmeddelandet? Varför blir det fel? -scala> val teamNameOrdering = Ordering.by((t: Team) => t.name) -scala> xs.sorted(teamNameOrdering) //explicit ordning -scala> implicit val teamRankOrdering = Ordering.by((t: Team) => t.rank) +scala> val teamNameOrdering: Ordering[Team] = Ordering.by(t => t.name) +scala> xs.sorted(using teamNameOrdering) //explicit ordning +scala> given Ordering[Team] = Ordering.by(t => t.rank) scala> xs.sorted // Varför funkar det nu? \end{REPL} \Subtask Vill man sortera i omvänd ordning kan man använda \code{Ordering.fromLessThan} som tar en funktion \code{(T, T) => Boolean} vilken ska ge \code{true} om första parametern ska komma före, annars \code{false}. Om vi vill sortera efter \code{rank} i omvänd ordning kan vi göra så här: \begin{REPL} -scala> val highestRankFirst = - Ordering.fromLessThan[Team]((t1, t2) => t1.rank > t2.rank) -scala> xs.sorted(highestRankFirst) +scala> val highestRankFirst: Ordering[Team] = + Ordering.fromLessThan((t1, t2) => t1.rank > t2.rank) +scala> xs.sorted(using highestRankFirst) \end{REPL} -\Subtask Om du har en case-klass med flera fält och vill ha en fördefinierad implicit sorteringsordning samt även erbjuda en alternativ sorteringsordning kan du placera olika ordningsdefinitioner i ett kompanjonsobjekt; detta är nämligen ett av de ställen där kompilatorn söker efter eventuella implicita värden innan den ger upp att leta. +\Subtask Om du har en case-klass med flera fält och vill ha en fördefinierad implicit sorteringsordning samt \emph{även} erbjuda en alternativ sorteringsordning, så kan du placera en default ordningsdefinition i ett kompanjonsobjekt; detta är nämligen ett av de ställen där kompilatorn söker sist efter eventuella implicita värden innan den ger upp att leta. \begin{Code} case class Team(name: String, rank: Int) -object Team { - implicit val highestRankFirst = Ordering.fromLessThan[Team]{ - (t1, t2) => t1.rank > t2.rank - } - val nameOrdering = Ordering.by((t: Team) => t.name) -} +object Team: + given highestRankFirst: Ordering[Team] = + Ordering.fromLessThan((t1, t2) => t1.rank > t2.rank) + val nameOrdering: Ordering[Team] = Ordering.by(t => t.name) \end{Code} \begin{REPL} -scala> :pa -// Exiting paste mode, now interpreting. -case class Team(name: String, rank: Int) -object Team { - implicit val highestRankFirst = - Ordering.fromLessThan[Team]{(t1, t2) => t1.rank > t2.rank} - val nameOrdering = Ordering.by((t: Team) => t.name) -} scala> val xs = Vector(Team("fnatic", 1499), Team("nip", 1473), Team("lumi", 1601)) scala> xs.sorted @@ -248,7 +664,7 @@ \Subtask Det går också med kompanjonsobjektet ovan att få jämförelseoperatorer att fungera med din case-klass, genom att importera medlemmarna i lämpligt ordningsobjekt. Verifiera att så är fallet enligt nedan: \begin{REPL} scala> Team("fnatic",1499) < Team("gurka", 2) // Vilket fel? Varför? -scala> import Team.highestRankFirst._ +scala> import Team.highestRankFirst.given scala> Team("fnatic",1499) < Team("gurka", 2) // Inget fel? Varför? \end{REPL} @@ -256,7 +672,16 @@ \SOLUTION -\TaskSolved \what --- +\TaskSolved \what + +\SubtaskSolved \TODO + +\SubtaskSolved \TODO + +\SubtaskSolved \TODO + +\SubtaskSolved \TODO + \QUESTEND @@ -265,11 +690,11 @@ -\WHAT{Specialanpassad ordning genom att ärva från \code{Ordered}.} +\WHAT{Specialanpassad ordning genom att ärva från \code{Ordered}} \QUESTBEGIN -\Task \what~ Om det finns \emph{en} väldefinierad, specifik ordning som man vill ska gälla för sina case-klass-instanser kan man göra den ordnad genom att låta case-klassen mixa in traiten \code{Ordered} och implementera den abstrakta metoden \code{compare}. +\Task \what~ Om det finns \emph{en} väldefinierad, specifik ordning som man vill ska gälla för sina case-klass-instanser kan man göra den ordnad genom att låta case-klassen mixa in traiten \code{Ordered} och implementera den abstrakta metoden \code{compare}. (Detta illustrerar användning av subtypspolymorfism (d.v.s arv) i stället för ad hoc polymorfism med typklasser.) \begin{Background} En trait som används på detta sätt kallas \textbf{gränssnitt} \Eng{interface}, och om man \emph{implementerar} ett gränssnitt så uppfyller man ett ''kontrakt'', som i detta fall innebär att man implementerar det som krävs av ordnade objekt, nämligen att de har en konkret \code{compare}-metod. Du lär dig mer om gränssnitt i kommande kurser. @@ -278,146 +703,152 @@ \Subtask Implementera case-klassen \code{Team} så att den är en subtyp till \code{Ordered} enligt nedan skiss. Högre rankade lag ska komma före lägre rankade lag. Metoden \code{compare} ska ge ett heltal som är negativt om \code{this} kommer före \code{that}, noll om de ordnas lika, annars positivt. \begin{Code} -case class Team(name: String, rank: Int) extends Ordered[Team]{ +case class Team(name: String, rank: Int) extends Ordered[Team]: override def compare(that: Team): Int = ??? -} \end{Code} -\emph{Tips:} Du kan anropa metoden \code{compare} på alla grundtyper, t.ex. \code{Int}, eftersom de är implicit ordnade. Genom att negera uttrycket blir ordningen den omvända. -\begin{REPL} +\emph{Tips:} Du kan anropa metoden \code{compare} på alla grundtyper, t.ex. \code{Int}, eftersom de implementerar gränssnittet \code{Oredered}. Genom att negera uttrycket blir ordningen den omvända. + +\begin{REPLnonum} scala> -(2.compare(1)) -\end{REPL} +\end{REPLnonum} \Subtask Testa att din case-klass nu uppfyller det som krävs för att vara ordnad. -\begin{REPL} +\begin{REPLnonum} scala> Team("fnatic",1499) < Team("gurka", 2) -\end{REPL} +\end{REPLnonum} +\Subtask Diskutera med handledare eller kursare skillnader och likheter mellan gränssnitt och typklasser, med ledning av denna och föregående uppgifter. \SOLUTION \TaskSolved \what +\SubtaskSolved -Tänk på att för att sortering i omvänd ordning (alltså högst rank först) ska fungera så måste jämförelsen returnera \code{false}. - -\begin{CodeSmall} -case class Team(name: String, rank: Int) extends Ordered[Team]{ +\begin{Code} +case class Team(name: String, rank: Int) extends Ordered[Team]: override def compare(that: Team): Int = -rank.compare(that.rank) -} -\end{CodeSmall} - - - -\QUESTEND +\end{Code} +\SubtaskSolved +\begin{REPLnonum} +scala> Team("fnatic",1499) < Team("gurka", 2) +val res1: Boolean = true +\end{REPLnonum} -\WHAT{Sortering med inbyggda sorteringsmetoder.} +\SubtaskSolved Ad hoc polymorfism är mer flexibel. \TODO{mer diskussion om likheter och skillnader här...} -\QUESTBEGIN +\QUESTEND -\Task \what~ För grundtyperna (\code{Int}, \code{Double}, \code{String}, etc.) finns en fördefinierad ordning som gör så att färdiga sorteringsmetoder fungerar på alla samlingar i \code{scala.collection}. Även jämförelseoperatorerna i uppgift \ref{task:string-order-operators} fungerar enligt den fördefinierade ordningsdefinitionen för alla grundtyper. Denna ordningsdefinition är \textit{implicit tillgänglig} vilket betyder att kompilatorn hittar ordningsdefinitionen utan att vi explicit måste ange den. Detta fungerar i Scala även med primitiva \code{Array}. -\Subtask Testa metoden \code{sorted} på några olika samlingar. Förklara vad som händer. Hur lyder felmeddelandet på sista raden? Varför blir det fel? -\begin{REPL} -scala> Vector(1.1, 4.2, 2.4, 42.0, 9.9).sorted -scala> val xs = (100000 to 1 by -1).toArray -scala> xs.sorted -scala> xs.map(_.toString).sorted -scala> xs.map(_.toByte).sorted.distinct -scala> case class Person(firstName: String, familyName: String) -scala> val ps = Vector(Person("Robin", "Finkodare"), Person("Kim","Fulhack")) -scala> ps.sorted -\end{REPL} +% \WHAT{Sortering med inbyggda sorteringsmetoder.} + +% \QUESTBEGIN -\Subtask Om man har en samling med egendefinierade klasser eller man vill ha en annan sorteringsordning får man definiera ordningen själv. Ett helt generellt sätt att göra detta på illustreras i uppgift \ref{task:custom-ordering}, men de båda hjälpmetoderna \code{sortWith} och \code{sortBy} räcker i de flesta fall. Hur de används illustreras nedan. Metoden \code{sortBy} kan användas om man tar fram ett värde av grundtyp och är nöjd med den inbyggda sorteringsordningen. +% \Task \what~ För grundtyperna (\code{Int}, \code{Double}, \code{String}, etc.) finns en fördefinierad ordning som gör så att färdiga sorteringsmetoder fungerar på alla samlingar i \code{scala.collection}. Även jämförelseoperatorerna i uppgift \ref{task:string-order-operators} fungerar enligt den fördefinierade ordningsdefinitionen för alla grundtyper. Denna ordningsdefinition är \textit{implicit tillgänglig} vilket betyder att kompilatorn hittar ordningsdefinitionen utan att vi explicit måste ange den. Detta fungerar i Scala även med primitiva \code{Array}. -Metoden \code{sortWith} används om man vill skicka med ett eget jämförelsepredikat som ordnar två element; funktionen ska returnera \code{true} om det första elementet ska vara först, annars \code{false}. +% \Subtask Testa metoden \code{sorted} på några olika samlingar. Förklara vad som händer. Hur lyder felmeddelandet på sista raden? Varför blir det fel? -\begin{REPL} -scala> case class Person(firstName: String, familyName: String) -scala> val ps = Vector(Person("Robin", "Finkodare"), Person("Kim","Fulhack")) -scala> ps.sortBy(_.firstName) -scala> ps.sortBy(_.familyName) -scala> ps.sortBy // tryck TAB två gånger för att se signaturen -scala> ps.sortWith((p1, p2) => p1.firstName > p2.firstName) -scala> ps.sortWith // tryck TAB två gånger för att se signaturen -scala> Vector(9,5,2,6,9).sortWith((x1, x2) => x1 % 2 > x2 % 2) -\end{REPL} -Vad har metoderna \code{sortWith} och \code{sortBy} för signaturer? +% \begin{REPL} +% scala> Vector(1.1, 4.2, 2.4, 42.0, 9.9).sorted +% scala> val xs = (100000 to 1 by -1).toArray +% scala> xs.sorted +% scala> xs.map(_.toString).sorted +% scala> xs.map(_.toByte).sorted.distinct +% scala> case class Person(firstName: String, familyName: String) +% scala> val ps = Vector(Person("Robin", "Finkodare"), Person("Kim","Fulhack")) +% scala> ps.sorted +% \end{REPL} -\Subtask Lägg till attributet \code{age: Int} i case-klassen \code{Person} ovan och lägg till fler personer med olika namn och ålder i en vektor och sortera den med \code{sortBy} och \code{sortWith} för olika attribut. Välj själv några olika sätt att sortera på. +% \Subtask Om man har en samling med egendefinierade klasser eller man vill ha en annan sorteringsordning får man definiera ordningen själv. Ett helt generellt sätt att göra detta på illustreras i uppgift \ref{task:custom-ordering}, men de båda hjälpmetoderna \code{sortWith} och \code{sortBy} räcker i de flesta fall. Hur de används illustreras nedan. Metoden \code{sortBy} kan användas om man tar fram ett värde av grundtyp och är nöjd med den inbyggda sorteringsordningen. +% Metoden \code{sortWith} används om man vill skicka med ett eget jämförelsepredikat som ordnar två element; funktionen ska returnera \code{true} om det första elementet ska vara först, annars \code{false}. +% \begin{REPL} +% scala> case class Person(firstName: String, familyName: String) +% scala> val ps = Vector(Person("Robin", "Finkodare"), Person("Kim","Fulhack")) +% scala> ps.sortBy(_.firstName) +% scala> ps.sortBy(_.familyName) +% scala> ps.sortBy // tryck TAB två gånger för att se signaturen +% scala> ps.sortWith((p1, p2) => p1.firstName > p2.firstName) +% scala> ps.sortWith // tryck TAB två gånger för att se signaturen +% scala> Vector(9,5,2,6,9).sortWith((x1, x2) => x1 % 2 > x2 % 2) +% \end{REPL} +% Vad har metoderna \code{sortWith} och \code{sortBy} för signaturer? -\SOLUTION +% \Subtask Lägg till attributet \code{age: Int} i case-klassen \code{Person} ovan och lägg till fler personer med olika namn och ålder i en vektor och sortera den med \code{sortBy} och \code{sortWith} för olika attribut. Välj själv några olika sätt att sortera på. -\TaskSolved \what +% \SOLUTION -\SubtaskSolved -\begin{enumerate} -\item Returnerar en sorterad \code{Vector} av \code{double}-värden -\item Skapar en variabel xs och sparar en \code{Array} med \code{Int}-värden mellan 100000 till 1. -\item Sorterar \code{xs = 1,2,3...} -\item Konverterar xs till en \code{Array} av \code{String}-värden och sorterar dem lexikografiskt: \code{xs = "1", "10", "100"} etc. -\item Konverterar xs till en \code{Array} av \code{Byte}-värden (max 127, min -128) och sorterar dem, samt tar bort dubletter: \code{xs = -128, -127, -1...} -\item Skapar en ny klass \code{Person} som tar 2 \code{String}-argument i konstruktorn -\item Sparar en Vector med två \code{Person}-objekt i en variabel ps -\item Försöker kalla på \code{sorted}-metoden för klassen \code{Person}. Eftersom vi skrivit denna klass själva och inte berättat för Scala hur \code{Person}-objekt ska sorteras, resulterar detta i ett felmeddelande. -\end{enumerate} -\SubtaskSolved +% \TaskSolved \what -\begin{enumerate} -\item --- -\item --- -\item Sorterar \code{Person}-objekten i ps med avseende på värdet i \code{firstName} -\item Sorterar \code{Person}-objekten i ps med avseende på värdet i \code{familyName} -\item \code{sortBy} tar en funktion f som argument. f ska ta ett argument av typen \code{Person} och returnera en generisk typ B. -\item Sortera \code{Person}-objekten i ps med avseende på \code{firstName} i sjunkande ordning (omvänt från tidigare alltså) -\item \code{sortWith} tar en funktion lt som argument. lt ska i sin tur ta två argument av typen \code{Person} och returnera ett booleskt värde. -\item Sorterar en vektor så att värdena som är minst delbara med 2 hamnar först, och de mest delbara med 2 hamnar sist. Detta delar alltså upp udda och jämna tal. -\end{enumerate} -\SubtaskSolved -Klassens signatur blir då: -\begin{REPLnonum} -case class Person(firstName: String, lastName: String, age: Int) -\end{REPLnonum} +% \SubtaskSolved +% \begin{enumerate} +% \item Returnerar en sorterad \code{Vector} av \code{double}-värden +% \item Skapar en variabel xs och sparar en \code{Array} med \code{Int}-värden mellan 100000 till 1. +% \item Sorterar \code{xs = 1,2,3...} +% \item Konverterar xs till en \code{Array} av \code{String}-värden och sorterar dem lexikografiskt: \code{xs = "1", "10", "100"} etc. +% \item Konverterar xs till en \code{Array} av \code{Byte}-värden (max 127, min -128) och sorterar dem, samt tar bort dubletter: \code{xs = -128, -127, -1...} +% \item Skapar en ny klass \code{Person} som tar 2 \code{String}-argument i konstruktorn +% \item Sparar en Vector med två \code{Person}-objekt i en variabel ps +% \item Försöker kalla på \code{sorted}-metoden för klassen \code{Person}. Eftersom vi skrivit denna klass själva och inte berättat för Scala hur \code{Person}-objekt ska sorteras, resulterar detta i ett felmeddelande. +% \end{enumerate} -Lägg in dem i en vektor: -\begin{REPLnonum} -val ps2 = Vector(Person("a", "asson", 34), Person("asson", "assonson", 1234), -Person("anna", "Book", 2)) -\end{REPLnonum} +% \SubtaskSolved -Sortera dem på olika sätt: -\begin{enumerate} -\item -Vektorn blir sorterad med avseende på personernas ålder i stigande ordning -\begin{REPLnonum} -scala> ps2.sortWith((p1, p2) => p1.age < p2.age) -res40: scala.collection.immutable.Vector[Person] = Vector(Person(anna,Book,2), -Person(a,asson,34), Person(asson,assonson,1234)) -\end{REPLnonum} +% \begin{enumerate} +% \item --- +% \item --- +% \item Sorterar \code{Person}-objekten i ps med avseende på värdet i \code{firstName} +% \item Sorterar \code{Person}-objekten i ps med avseende på värdet i \code{familyName} +% \item \code{sortBy} tar en funktion f som argument. f ska ta ett argument av typen \code{Person} och returnera en generisk typ B. +% \item Sortera \code{Person}-objekten i ps med avseende på \code{firstName} i sjunkande ordning (omvänt från tidigare alltså) +% \item \code{sortWith} tar en funktion lt som argument. lt ska i sin tur ta två argument av typen \code{Person} och returnera ett booleskt värde. +% \item Sorterar en vektor så att värdena som är minst delbara med 2 hamnar först, och de mest delbara med 2 hamnar sist. Detta delar alltså upp udda och jämna tal. +% \end{enumerate} -\item -Sorterar vektorn med avseende på namn, men också med avseende på ålder (i sjunkande ordning). För att komma före någon i ordningen måste alltså både namnet komma före, och åldern vara högre. -\begin{REPLnonum} -scala> ps2.sortWith((p1, p2) => (p1.firstName < p2.firstName) && -(p1.age > p2.age)) -res42: scala.collection.immutable.Vector[Person] = Vector(Person(a,asson,34), -Person(asson,assonson,1234), Person(anna,Book,2)) -\end{REPLnonum} -\end{enumerate} +% \SubtaskSolved +% Klassens signatur blir då: +% \begin{REPLnonum} +% case class Person(firstName: String, lastName: String, age: Int) +% \end{REPLnonum} +% Lägg in dem i en vektor: +% \begin{REPLnonum} +% val ps2 = Vector(Person("a", "asson", 34), Person("asson", "assonson", 1234), +% Person("anna", "Book", 2)) +% \end{REPLnonum} +% Sortera dem på olika sätt: +% \begin{enumerate} +% \item +% Vektorn blir sorterad med avseende på personernas ålder i stigande ordning +% \begin{REPLnonum} +% scala> ps2.sortWith((p1, p2) => p1.age < p2.age) +% res40: scala.collection.immutable.Vector[Person] = Vector(Person(anna,Book,2), +% Person(a,asson,34), Person(asson,assonson,1234)) +% \end{REPLnonum} -\QUESTEND +% \item +% Sorterar vektorn med avseende på namn, men också med avseende på ålder (i sjunkande ordning). För att komma före någon i ordningen måste alltså både namnet komma före, och åldern vara högre. +% \begin{REPLnonum} +% scala> ps2.sortWith((p1, p2) => (p1.firstName < p2.firstName) && +% (p1.age > p2.age)) +% res42: scala.collection.immutable.Vector[Person] = Vector(Person(a,asson,34), +% Person(asson,assonson,1234), Person(anna,Book,2)) +% \end{REPLnonum} +% \end{enumerate} + + + +% \QUESTEND diff --git a/compendium/modules/w12-assignment-add-docs-task.tex b/compendium/modules/w12-assignment-add-docs-task.tex new file mode 100644 index 000000000..916a4606f --- /dev/null +++ b/compendium/modules/w12-assignment-add-docs-task.tex @@ -0,0 +1 @@ +Du ska inför redovisningen generera automatisk dokumentation baserat på dokumentationskommentarer enligt instruktioner i Appendix \ref{appendix:doc}. Du ska skriva relevanta dokumentationskommentarer för minst hälften av dina publika metoder. Det är ofta användbart att skriva dokumentationskommentarerna \emph{före} implementationen av metodkroppen. \ No newline at end of file diff --git a/compendium/modules/w12-assignment-bank.tex b/compendium/modules/w12-assignment-bank.tex index 51c5e5262..6f2cac715 100644 --- a/compendium/modules/w12-assignment-bank.tex +++ b/compendium/modules/w12-assignment-bank.tex @@ -63,104 +63,17 @@ \subsection{Krav} \item Det räcker med att banken ska kunna hantera heltal, men detta ska göras med klassen \code{BigInt} för att tillåta stora belopp. Om din bank hanterar decimaltal ska detta ske med \code{BigDecimal} för att undvika avrundningsfel. \item Klassen \code{BankAccount} ska generera ett unikt kontonummer för varje konto. Dessa ska återställas om bankens tillstånd återställs till ett tidigare datum, d.v.s. att om en återställning av banken tar bort ett konto så ska dess kontonummer återigen bli tillgängligt. \item Det enda sättet att förändra tillståndet för en \code{Bank} ska vara (förutom att anropa \code{returnToState}) att anropa \code{doEvent} med en \code{BankEvent} som beskriver tillståndsförändringen. Vid en första anblick kan detta kan verka lite väl bökigt, men när ändringshistoriken ska implementeras kommer det vara till stor hjälp att det finns en \code{BankEvent} som representerar varje ändring. +\item \input{modules/w12-assignment-add-docs-task.tex} \end{itemize} \subsection{Design} -Nedan följer specifikationerna för de olika klasserna bankapplikationen måste innehålla: - -\begin{ScalaSpec}{Customer} -/** - * Describes a customer of a bank with provided name and id. - */ -case class Customer(name: String, id: Long) { - override def toString(): String = ??? -} -\end{ScalaSpec} - - -\begin{ScalaSpec}{BankAccount} -/** - * Creates a new bank account for the customer provided. - * The account is given a unique account number and initially - * has a balance of 0 kr. - */ -class BankAccount(val holder: Customer) { - val accountNumber: Int = ??? - - /** - * Deposits the provided amount in this account. - */ - def deposit(amount: BigInt): Unit = ??? - - /** - * Returns the balance of this account. - */ - def balance: BigInt = ??? - - /** - * Withdraws the provided amount from this account, - * if there is enough money in the account. Returns true - * if the transaction was successful, otherwise false. - */ - def withdraw(amount: BigInt): Boolean = ??? - - override def toString(): String = ??? -} -\end{ScalaSpec} - - -\begin{ScalaSpec}{Bank} -/** - * Creates a new bank with no accounts and no history. - */ -class Bank() { - /** - * Returns a list of every bank account in the bank. - * The returned list is sorted in alphabetical order based - * on customer name. - */ - def allAccounts(): Vector[BankAccount] = ??? - - /** - * Returns the account holding the provided account number. - */ - def findByNumber(accountNbr: Int): Option[BankAccount] = ??? - - /** - * Returns a list of every account belonging to - * the customer with the provided id. - */ - def findAccountsForHolder(id: Long): Vector[BankAccount] = ??? - - /** - * Returns a list of all customers whose names match - * the provided name pattern. - */ - def findByName(namePattern: String): Vector[Customer] = ??? - - /** - * Executes an event in the bank. - * Returns a string describing whether the - * event was successful or failed. - */ - def doEvent(event: BankEvent): String = ??? - - /** - * Returns a log of all changes to the bank's state. - */ - def history(): Vector[HistoryEntry] = ??? - - /** - * Resets the bank to the state it had at the provided date. - * Returns a string describing whether the event was - * successful or failed. - */ - def returnToState(returnDate: Date): String = ??? -} -\end{ScalaSpec} +Nedan följer beskriving av medlemmar som de olika klasserna bankapplikationen måste innehålla. Dessa påbörjade klasser finns i kursens workspace, tillsammans med de färdigskrivna klasserna \code{HistoryEntry} och \code{Date} samt \code{BankEvent} med tillhörande subtyper: \url{https://github.com/lunduniversity/introprog/tree/master/workspace/w13_bank_proj} + +\scalainputlisting[basicstyle=\ttfamily\fontsize{10}{13}\selectfont]{../workspace/w13_bank_proj/src/main/scala/bank/Customer.scala} +\scalainputlisting[basicstyle=\ttfamily\fontsize{10}{13}\selectfont]{../workspace/w13_bank_proj/src/main/scala/bank/BankAccount.scala} -Till din hjälp innehåller kursens workspace de färdigskrivna klasserna \code{HistoryEntry} och \code{Date} samt \code{BankEvent} med tillhörande subtyper. +\scalainputlisting[basicstyle=\ttfamily\fontsize{10}{13}\selectfont]{../workspace/w13_bank_proj/src/main/scala/bank/Bank.scala} \subsection{Tips} @@ -181,7 +94,7 @@ \subsection{Tips} \item För att läsa ifrån en fil kan man t.ex. använda sig av \code{Source} som finns tillgänglig i \code{scala.io.Source}. -\item Var noggrann med att testerna klarar alla tänkbara fall, och tänk på att fler fall än dem som givits i exempel kan förekomma vid rättning. +\item Var noggrann med att dina tester innehåller fler fall än de som givits i exempel (se \ref{bank:exempel}), vilka kan behövas för mer omfattande testning och avlusning och efterfrågas på redovisningen. \end{itemize} \subsection{Obligatoriska uppgifter} @@ -215,15 +128,15 @@ \subsection{Frivilliga extrauppgifter} Gör först klart projektets obligatoriska delar. Därefter kan du, om du vill, utöka ditt program enligt följande. -\Task Skriv en eller flera av klasserna \code{Customer} och \code{BankAccount} i Java istället och använd dig av dessa i din Scala-kod. +\Task Implementera ett nytt menyalternativ som skriver ut all kontohistorik för en given person. I historiken ska finnas typ av händelse med tillhörande parametrar, dåvarande saldo vid händelsen, såväl som datumet för händelsen. (Du kan ha nytta av denna funktion när du testar ditt program.) -\Task Implementera ett nytt menyalternativ som skriver ut all kontohistorik för en given person. I historiken ska finnas typ av händelse med tillhörande parametrar, dåvarande saldo vid händelsen, såväl som datumet för händelsen. +\Task Skriv en eller flera av klasserna \code{Customer} och \code{BankAccount} i Java istället och använd dig av dessa i din Scala-kod. (Detta är en nyttig uppgift som förberedelse inför efterkommande fördjupningskurs, som har Java som huvudspråk.) \subsection{Exempel på historikfil} I workspace-katalogen för denna projektuppgift medföljer en historikfil. Inläsning och utskrift ska ske med dess format. Varje rad representerar en händelse, och formatet för en rad är: \textbf{År Månad Dag Timme Minut BankEventTyp Argument}. De olika sorternas \code{BankEvent} representeras med följande bokstäver: D för \code{Deposit}, W för \code{Withdraw}, T för \code{Transfer}, N för \code{NewAccount} och E för \code{DeleteAccount}. -\subsection{Exempel på körning av programmet} +\subsection{Exempel på körning av programmet}\label{bank:exempel} Nedan visas möjliga exempel på körning av programmet. Data som matas in av användaren är markerad i fetstil. Ditt program måste inte se identiskt ut, men den övergripande strukturen såväl som resultat av körningen ska vara densamma. diff --git a/compendium/modules/w12-assignment-music.tex b/compendium/modules/w12-assignment-music.tex index e94d1f49a..da946d6a2 100644 --- a/compendium/modules/w12-assignment-music.tex +++ b/compendium/modules/w12-assignment-music.tex @@ -51,7 +51,7 @@ \subsubsection{Tonhöjd} \item Metoden \code {apply} kastar ett undantag om det inte går att omvandla en sträng till ett \code{Pitch}-objekt. \end{itemize} -\Task\label{music:exceptions}\Pen Vilka två uttryck i \code{Try}-blocket kan ge undantag? Undersök liknande undantagsuttryck i REPL och skriv ner namnet på undantagen. +\Task\label{music:exceptions}\Pen Vilka två uttryck i \code{Try}-blocket kan ge undantagen \code{NumberFormatException} respektive \code{NoSuchElementException}? Undersök liknande uttryck i REPL som ger dessa undantag. Hur kan fabriksmetoden \code{fromString} skrivas om så att den använder \code{toIntOption} i stället för \code{toInt} på strängen och \code{get} i stället för \code{apply} på nyckelvärde-tabellen och utan att använda \code{scala.util.Try}? Vad finns det för nackdelar med att gå omvägen via \code{scala.util.Try} i stället för metoder som direkt ger \code{Option}? \Task Undersök klassen \code{Pitch} i REPL. @@ -241,6 +241,7 @@ \subsubsection{Elektroniska instrument} Play Guitar((0,2,2,0,0,0)) Chord(E3,B3,E4,G4,B4,E5) \end{REPL} +\Task \input{modules/w12-assignment-add-docs-task.tex} % ... % diff --git a/compendium/modules/w12-assignment-photo.tex b/compendium/modules/w12-assignment-photo.tex index f9b84044b..545b3cd84 100644 --- a/compendium/modules/w12-assignment-photo.tex +++ b/compendium/modules/w12-assignment-photo.tex @@ -332,6 +332,8 @@ \subsection{Uppgiften} Tänk på att användaren kan mata in otillåtna värden. Detta ska hanteras på lämpligt sätt. +\Task \input{modules/w12-assignment-add-docs-task.tex} + \subsection{Frivilliga extrauppgifter} \Task \textbf{Kontrastfilter.} Om man applicerar kontrastfiltrering på en färgbild så kommer bilden att konverteras till en gråskalebild. (Man kan naturligtvis förbättra kontrasten i en färgbild och få en färgbild som resultat. Då behandlar man de tre färgkanalerna var för sig.) Många bilder lider av alltför låg kontrast. Det beror på att bilden inte utnyttjar hela det tillgängliga området 0–255 för intensiteten. Man får en bild med bättre kontrast om man ''töjer ut'' intervallet enligt följande formel (linjär interpolation): diff --git a/compendium/modules/w12-assignment-tabular.tex b/compendium/modules/w12-assignment-tabular.tex index 807952d51..50eca75c1 100644 --- a/compendium/modules/w12-assignment-tabular.tex +++ b/compendium/modules/w12-assignment-tabular.tex @@ -159,7 +159,7 @@ \subsection{Implementation} \noindent Tips vid färdigställande av \code{Table}: \begin{itemize}[leftmargin=*] - \item Nyckel-värde-tabeller har en metod \code{withDefaultValue} som är smidig om man vill undvika undantag vid uppslagning med nyckel som inte finns och det i stället för undantag är möjligt/lämpligt att erbjuda ett vettigt defaultvärde. + \item Nyckel-värde-tabeller har en metod \code{withDefaultValue} som är smidig om man vill undvika undantag vid uppslagning med nyckel som inte finns och det i stället för undantag är möjligt/lämpligt att erbjuda ett vettigt defaultvärde vid \code{apply}. Notera dock att om du itererar över alla nyckel-värdepar med t.ex. \code{map} eller \code{for}, så kommer enbart existerande nycklar att ingå\footnote{Se kommentar om du expanderar dokumentationen för \code{Map.withDefualtValue} här: \url{https://www.scala-lang.org/api/3.1.2/scala/collection/immutable/Map.html\#withDefaultValue-bec}}. \item Metoderna \code{getOrElse} och \code{toOption} på en \code{Try} är smidiga när man vill ge resultat som beror av om det är \code{Success} eller \code{Failure} utan att man behöver göra en \code{match}. \item Skiss på implementation av \code{load} i kompanjonsobjektet: \begin{CodeSmall} diff --git a/compendium/modules/w12-extra-chapter.tex b/compendium/modules/w12-extra-chapter.tex index beab1d66e..5d778653c 100644 --- a/compendium/modules/w12-extra-chapter.tex +++ b/compendium/modules/w12-extra-chapter.tex @@ -3,9 +3,9 @@ %!TEX root = ../compendium2.tex \input{generated/w12-chaphead-generated.tex} -\clearpage\section{Teori} -\input{../slides/body/lect-w12-algorithms.tex} -\input{../slides/body/lect-w12-search.tex} -\input{../slides/body/lect-w12-sort.tex} -%\input{../slides/body/lect-w12-project-assignment.tex} +\clearpage\section{Projektuppgift} +% \input{../slides/body/lect-w12-algorithms.tex} +% \input{../slides/body/lect-w12-search.tex} +% \input{../slides/body/lect-w12-sort.tex} +\input{../slides/body/lect-w12-project-assignment.tex} %\input{../slides/body/lect-w12-project-music.tex} diff --git a/compendium/modules/w12-extra-exercise.tex b/compendium/modules/w12-extra-exercise.tex index 40fdcbdfa..2408d57b4 100644 --- a/compendium/modules/w12-extra-exercise.tex +++ b/compendium/modules/w12-extra-exercise.tex @@ -7,6 +7,7 @@ \Exercise{\ExeWeekTWELVE}\label{exe:W12} \begin{Goals} +\item Denna veckas övning innehåller valfri fördjupning. \item Sökning och sortering: \begin{itemize} \item Kunna använda inbyggda sökmetoder. @@ -244,7 +245,7 @@ \subsection{Uppgifter om sökning och sortering} \Subtask \label{subtask:linsearch-rndCode} Implementera en funktion \code{def rndCode: String} som genererar slumpmässiga kurskoder som består av 4 bokstäver mellan A och Z följt av 2 siffror mellan 0 och 9. \emph{Tips:} Använd REPL i kombination med en editor för att stegvis skapa och testa hjälpfunktioner som löser lämpliga delproblem. -\Subtask Använd \code{rndCode} från föregående deluppgift för att fylla en vektor kallad \code{xs} med en halv miljon slumpmässiga kurskoder. För varje slumpkod i \code{xs} sök med din funktion \code{linearSearch} efter index i vektorn \code{courses.lth2017} från deluppgift \ref{subtask:download-lthcourses}. Mät totala tiden för de $500000$ linjärsökningarna med hjälp av funktionen \code{timed} från uppgift \ref{task:timed}. Hur många av de slumpmässiga kurskoderna hittades bland de verkliga kurskoderna på LTH? +\Subtask Använd \code{rndCode} från föregående deluppgift för att fylla en vektor kallad \code{xs} med en halv miljon slumpmässiga kurskoder. För varje slumpkod i \code{xs} sök med din funktion \code{linearSearch} efter index i vektorn \code{courses.lth} från deluppgift \ref{subtask:download-lthcourses}. Mät totala tiden för de $500000$ linjärsökningarna med hjälp av funktionen \code{timed} från uppgift \ref{task:timed}. Hur många av de slumpmässiga kurskoderna hittades bland de verkliga kurskoderna på LTH? @@ -689,8 +690,7 @@ \subsection{Uppgifter om sökning och sortering} \Subtask\Pen Vad blir antalet jämförelser i värstafallet med metoden i deluppgift \ref{subtask:issorted} om du har $n$ element? -\Subtask \label{subtask:isSorted-zip} Man kan kolla om en sekvens är sorterad med det listiga tricket att först zippa sekvensen med sin egen svans och sedan kolla om alla element-par uppfyller sorteringskriteriet, alltså \code{xs.zip(xs.tail).forall(???)} där \code{???} byts ut mot lämpligt predikat. Vilken typ har 2-tupeln \code{xs.zip(xs.tail))} om \code{xs} är av typen \code{Vector[Int]}? Implementera \code{isSorted} med detta listiga trick. (Senare, i fördjupningsuppgift \ref{task:implicit-ordering}, ska vi göra \code{isSorted} generellt användbar för olika typer och olika ordningsdefinitioner.) - +\Subtask \label{subtask:isSorted-zip} Man kan kolla om en sekvens är sorterad med det listiga tricket att först zippa sekvensen med sin egen svans och sedan kolla om alla element-par uppfyller sorteringskriteriet, alltså \code{xs.zip(xs.tail).forall(???)} där \code{???} byts ut mot lämpligt predikat. Vilken typ har 2-tupeln \code{xs.zip(xs.tail))} om \code{xs} är av typen \code{Vector[Int]}? Implementera \code{isSorted} med detta listiga trick. \SOLUTION @@ -1601,7 +1601,7 @@ \subsection{Upgifter om trådar och jämlöpande exekvering} \Subtask Studera dokumentationen för \code{scala.concurrent.duration.Duration}\footnote{\href{http://www.scala-lang.org/api/current/scala/concurrent/duration/Duration.html}{www.scala-lang.org/api/current/scala/concurrent/duration/Duration.html}}. Vilka tidsenheter kan användas? -\Subtask Vid import av \code{scala.concurrent.duration._ } dekoreras de numeriska klasserna med metoder för att skapa instanser av klassen \code{Duration}. Detta möjligörs med hjälp av klassen \code{scala.concurrent.duration.DurationConversions}. Studera dess dokumentation och testa att i REPL skapa några tidsperioder med metoderna på \code{Int}. +\Subtask Vid import av \code{scala.concurrent.duration.* } dekoreras de numeriska klasserna med metoder för att skapa instanser av klassen \code{Duration}. Detta möjligörs med hjälp av klassen \code{scala.concurrent.duration.DurationConversions}. Studera dess dokumentation och testa att i REPL skapa några tidsperioder med metoderna på \code{Int}. diff --git a/compendium/postchapters/build.tex b/compendium/postchapters/build.tex index 61d08caa1..b4756aeb6 100644 --- a/compendium/postchapters/build.tex +++ b/compendium/postchapters/build.tex @@ -163,7 +163,7 @@ \subsubsection{Konfigurera dina byggen i filen \code{build.sbt}} \begin{figure}[H] \centering \begin{Code} -scalaVersion := "3.0.1" +scalaVersion := "3.1.3" \end{Code} \caption{Exempel på konfigurationsfil för \sbt. Filen ska ha namnet \code{build.sbt} och vara placerad i projektets baskatalog.} \label{fig:sbt:build-file} @@ -189,7 +189,7 @@ \subsubsection{Konfigurera dina byggen i filen \code{build.sbt}} \subsubsection{Fixera versionen för sbt i \code{project/build.properties}} Om du skapar en katalog \code{project} (om den inte redan finns) kan du i en fil med namnet \code{build.properties} fixera versionen av sbt genom att låta filen ha detta innehåll (notera punkten och avsaknaden av citationstecken): \begin{Code} -sbt.version=1.5.5 +sbt.version=1.6.2 \end{Code} På så sätt riskerar du inga inkonsekvenser mellan en gammal \code{build.sbt} vid framtida uppdatering av sbt, ovan inställning garanterar att ditt bygge alltid kommer att byggas med denna version av sbt, och andra kan bygga din kod under samma förutsättningar som du. @@ -198,8 +198,8 @@ \subsubsection{Lägga till kursbiblioteket \texttt{introprog} som ett beroende} Med följande text i \code{build.sbt} får du automatisk nedladdning och tillgång till kursens Scala-bibliotek \texttt{introprog} med bl.a. klassen \code{PixelWindow} för grafiska fönster: \begin{Code} -scalaVersion := "3.0.1" -libraryDependencies += "se.lth.cs" %% "introprog" % "1.2.0" +scalaVersion := "3.1.3" +libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" \end{Code} Ändra ev. versionsnummer till senaste versionen. Notera de dubbla procent-tecknen före biblioteksnamnet, som används för Scala-bibliotek som kors-publicerats för olika versioner av Scala, t.ex. 3, 2.12 och 2.13, vilket gör att rätt biblioteksversion för rätt kompilatorversion laddas ned. diff --git a/compendium/postchapters/compile.tex b/compendium/postchapters/compile.tex index 0b564daf7..60737b33f 100644 --- a/compendium/postchapters/compile.tex +++ b/compendium/postchapters/compile.tex @@ -49,11 +49,8 @@ \subsection{Välj editor}\label{appendix:compile:edit} \begin{longtable}{@{}r | p{0.8\textwidth}} \textit{Editor} & \textit{Beskrivning} \\ \hline -VS Code & Öppen, fri och gratis. Finns för Linux, Windows, \& Mac. Är förinstallerad på LTH:s Linux-datorer och startas med kommandot \verb+code+. Öppenkällkodsprojektet startades av Microsoft och har en aktiv gemenskap med många utvecklare och många användbara tillägg \Eng{extensions}. Sök efter tillägget \textit{Scala Syntax (official)} och klicka ''install'' så får du syntaxfärgning för Scala. Med paketet \textit{Scala (Metals)} får du många extra IDE-funktioner. -\newline \url{https://code.visualstudio.com/} \newline \url{https://scalameta.org/metals/docs/editors/vscode.html}\\ - -Atom & Öppen, fri och gratis. Finns för Linux, Windows, \& Mac. Är förinstallerad på LTH:s Linux-datorer och startas med kommandot \verb+atom+. Öppenkällkodsprojektet startades av Github och har en aktiv gemenskap med många utvecklare och många användbara paket \Eng{packages}. Sök efter paketet \verb+language-scala+ och klicka ''install'' så får du syntaxfärgning för Scala. Med paketet \verb+ide-scala+ får du många extra IDE-funktioner. -\newline \url{https://atom.io/} \newline \url{https://scalameta.org/metals/docs/editors/atom.html}\\ +VS Code & Öppen, fri och gratis. Finns för Linux, Windows, \& Mac. Är förinstallerad på LTH:s Linux-datorer och startas med kommandot \verb+code+. Öppenkällkodsprojektet startades av Microsoft och har en aktiv gemenskap med många utvecklare och många användbara tillägg \Eng{extensions}. Sök efter tillägget \texttt{scalameta.metals} och installera så får du syntaxfärgning och många andra IDE-funktioner för Scala. +\newline \url{https://code.visualstudio.com/} \newline \url{https://scalameta.org/metals/docs/editors/vscode/#installation}\\ Gedit & Öppen, fri och gratis. Lätt att lära men inte så avancerad. Är förinstallerad på LTH:s Linux-datorer och startas med kommandot \verb+gedit+. \newline \url{https://wiki.gnome.org/Apps/Gedit} \\ @@ -140,7 +137,7 @@ \subsection{Kontrollera om du har JDK installerat}\label{appendix:compile:check- \texttt{javac \JDKVersion.x.y}\\ Om utskriften säger att \texttt{javac} saknas, installera JDK enl. nedan. -Vi använder alltså JDK \JDKVersion~i kursen. Det går också bra att använda den äldre JDK 8, men JDK 9 eller 10 fungerar inte med alla verktyg vi använder och senare versioner än \JDKVersion~ kan också ge problem. Läs mer under ''Verktyg'' på kurshemsidan. +Vi använder alltså JDK \JDKVersion~i kursen. Det går också bra att använda de äldre versionerna JDK 8 och JDK 11, men JDK 9 eller 10 fungerar inte med alla verktyg vi använder och senare versioner än \JDKVersion~ kan också ge problem. Läs mer under ''Verktyg'' på kurshemsidan. %Du kanske redan har enbart Java Runtime Environment (JRE) installerad, men inte JDK. Då saknar du Javakompilatorn \texttt{javac} m.m. och behöver installera JDK, se nedan. Du kan kolla om du har JRE genom att skriva \texttt{java -version} (alltså utan \texttt{c} efter \texttt{java}). Eller så har du redan JDK installerad men inte rätt katalog i din PATH. @@ -150,9 +147,9 @@ \subsection{Kontrollera om du har JDK installerat}\label{appendix:compile:check- \subsection{Installera JDK}\label{appendix:compile:install-jdk} -Det finns flera JDK-distributioner att välja mellan, varav OpenJDK och Oracle JDK är två exempel. Vi använder OpenJDK \JDKVersion~i kursen, som enklast installeras via \\ \url{https://adoptopenjdk.net/}. % För att installera JDK på din egen dator behöver du gå igenom flera steg, varav vissa behöver anpassas efter det operativsystem du kör, enligt nedan. +Det finns flera JDK-distributioner att välja mellan, varav OpenJDK och Oracle JDK är två exempel. Vi använder OpenJDK i kursen, som kan installeras via \\ \url{https://adoptium.net/temurin/releases/?version=17}. -På kurshemsidan under ''Verktyg'' finns detaljerade instruktioner om hur du gör: \\ \url{http://cs.lth.se/pgk/verktyg} +Om du installerar alla Scala-verktyg med hjälp av Coursier enligt instruktioner på kurshemsidan under ''Verktyg'', \url{http://cs.lth.se/pgk/verktyg} så kommer JDK att installeras automatiskt (om du inte redan har JDK). % För att installera JDK på din egen dator behöver du gå igenom flera steg, varav vissa behöver anpassas efter det operativsystem du kör, enligt nedan. % % @@ -255,6 +252,9 @@ \subsection{Scala Read-Evaluate-Print-Loop (REPL)}\label{appendix:compile:REPL} Du startar Scala REPL med kommandot \texttt{scala} och skriver Scala-kod efter prompten \texttt{scala>} och kompilering+exekvering sker när du trycker Enter. \begin{REPLnonum} > scala +Welcome to Scala 3.1.2 (17.0.2, Java OpenJDK 64-Bit Server VM). +Type in expressions for evaluation. Or try :help. + scala> 41 + 1 val res0: Int = 42 \end{REPLnonum} @@ -263,8 +263,6 @@ \subsection{Scala Read-Evaluate-Print-Loop (REPL)}\label{appendix:compile:REPL} Om du skriver en ofullständig rad fortsätter editeringen på nästa rad. Du kan navigera mellan raderna med pil-upp- och pil-ner-tangenterna. När du avslutar med en rad som gör din kod fullständig så kompileras och exekveras alla raderna. Du kan avbryta flerradsediteringen i förtid genom skriva ett semikolon \texttt{;} och sen trycka Enter. Vill du fortsätta editeringen med en ny rad och förhindra för tidig evaluering så tryck Alt+Enter. Se exempel nedan: -%Med kommandot \texttt{:paste} försätter du Scala REPL i inklistringsläge \Eng{paste mode} och du kan då med Ctrl+V (eller Ctrl+Shift+V, eller eventuellt högerklick med musen, beroende på hur ditt terminalprogram är inställt och vilket operativsystem du kör) klistra in större sjok av kod. När du med Ctrl+D avslutar inklistringsläget tolkar Scala REPL alla raderna på en gång. Kommandot \texttt{:paste} kan förkortas till \texttt{:pa}, så som visas nedan. Koden mellan raderna som börjar med \texttt{//} klistrades in av användaren efter att ha kopierats från en editor i ett annat fönster. - \begin{REPLnonum} scala> def fleraRader = 42 // Alt+Enter ger ny rad | + "ny rad".length // fortsättningsrad, avsluta med Enter @@ -275,18 +273,145 @@ \subsection{Scala Read-Evaluate-Print-Loop (REPL)}\label{appendix:compile:REPL} Med kommandot \texttt{:help} får du se en lista med specialkommandon för Scala REPL: \begin{REPLsmall} -scala> :help The REPL has several commands available: -:help print this summary -:load interpret lines in a file -:quit exit the interpreter -:type evaluate the type of the given expression -:doc print the documentation for the given expression -:imports show import history -:reset reset the repl to its initial state, forgetting all session entries +:help print this summary +:load interpret lines in a file +:quit exit the interpreter +:type evaluate the type of the given expression +:doc print the documentation for the given expression +:imports show import history +:reset [options] reset the repl to its initial state, forgetting all session entries +:settings update compiler options, if possible + + +\end{REPLsmall} + +Du kan också starta Scala REPL med hjälpa av kommandot \code{scala-cli repl .} med ett blanktecken och en punkt på slutet. Punkten gör att alla \code{.scala}-filer som finns i aktuell katalog kompileras av Scala CLI och görs tillgänglig för användning i REPL. + +\subsection{Scala Command Line Interface (Scala CLI)}\label{appendix:compile:scala-cli} + +Det finns sedan 2022 ett nytt smidigt kommandoradsgränssnitt \Eng{command line interface} för att kompilera, exekvera och paketera Scala-program som kallas \emph{Scala CLI}. Om du installerar Scala-verktygen enligt instruktioner på kurshemsidan under ''Verktyg'', \url{http://cs.lth.se/pgk/verktyg} så medföljer Scala CLI. + +Här finns några användbara kommandon: +\begin{itemize} +\item Första gången du kör en nyinstallerad Scala CLI-installation så kör detta kommando så att du får tillgång till smidiga kompletteringar med TAB-tangenten:\\ +\texttt{scala-cli install completions} + +\item Med hjälp av detta kommando kan du förbereda VS Code för samverkan med Scala CLI (notera blanktecken och avslutande punkt):\\ +\texttt{scala-cli setup-ide .}\\ +Kör ovan kommando innan du startar VS Code första gången med \texttt{code .} i aktuell katalog, eller avsluta VS Code och kör ovan kommando och starta VS Code igen med \texttt{code .} i aktuell katalog. + + +\item Scala CLI kan köra igång REPL i aktuell katalog med dina Scala- och Java-program automatiskt kompilerade och tillgängliggjorda i REPL med hjälp av nedan kommando. Med optionen \code{-S} anger du vilken version av Scala du vill köra:\\ +\code{scala-cli repl . -S 3} + +\item I stället för att ange Scala-version med optionen \code{-S} på kommandoraden kan du inuti ditt program, på första raden, skriva denna ''magiska'' kommentar:\\ +\code{//> using scala "3.1.2"} \\ +Då kommer Scala CLI att automatiskt välja (och vid behov ladda ned) önskad version av Scala-kompilatorn (notera \code{>} efter \texttt{//}): + +\item Kompilera alla Scala- och Java-program i aktuell katalog och se eventuella felmeddelanden. Med hjälp av \code{--watch} (kan förkortas till \code{-w}) så kompileras alla filer automatiskt om så fort ändringar sparas i VS Code (kortkommando Ctrl+S):\\ +\code{scala-cli compile . --watch} + +\item Kör Scala- och Java-program i aktuell katalog med start av den topp-nivå-\code{def} som är märkt \code{@main} (om det finns flera får du en frågan om vilken \code{@main def} du vill köra).:\\ +\code{scala-cli run .} + +\item Skapa en exekverbar fil:\\ +\texttt{scala-cli package .} + +\item Skapa en kopia av ditt projekt med katalogstruktur och filer anpassade för byggverktyget \code{sbt} (se Appendix \ref{appendix:build}):\\ +\verb|scala-cli export . --sbt --output ../nameofnewprojdir|\\ +Ändra katalognamnet \code{nameofnewprojdir} till valfritt nytt namn på en katalog som inte existerar. Notera de dubbla punkterna som gör att nya katalogen hamnar på samma nivå som ditt nuvarande projekt, och \emph{inte} i din aktuella katalog (för att undvika att dubbletter av dina scala-filer ger kompileringsfel). + +\item Om du skriver \texttt{scala-cli help} så får du se vad du mer kan göra: + +\begin{REPLsmall} +> scala-cli help + +Scala CLI is a command-line tool to interact with the Scala language. +It lets you compile, run, test, and package your Scala code. + +Other commands: + export Export current project to sbt or Mill + help Print help message + install completions Installs completions into your shell + setup-ide Generate a BSP file that you can import into your IDE + update Update scala-cli + +Doctor commands: + doctor Print details about this application + +Main commands: + clean Clean the workspace + compile Compile Scala code + doc Generate Scaladoc documentation + fmt, format, scalafmt Format Scala code + console, repl Fire-up a Scala REPL + package Compile and package Scala code + run Compile and run Scala code. + test Compile and test Scala code + +Miscellaneous commands: + about Print details about this application + version Print `scala-cli` version + +See 'scala-cli --help' to read about a specific subcommand. +To see full help run 'scala-cli --help-full'. \end{REPLsmall} +\item Om du skriver \code{scala-cli run --help} så får du se mer information om \texttt{run}-kommandot: + +\begin{REPLsmall} +To pass arguments to the application, just add them after `--`, like: +scala-cli run . -- first-arg second-arg + +Help options: + --usage Print usage and exit + -h, -help, --help Print help message and exit + --help-full, --full-help Print help message + +Scala options: + -S version Set the Scala version + -O option Add a `scalac` option + --scalac-help Show help for scalac + --js Enable Scala.js, see --help-js + --native Enable Scala Native, see --help-native + +Java options: + --java-home path Set the Java home directory + -j, --jvm jvm-name Use a specific JVM, such as 17 + --jar, Add extra JARs to class path + --source-jar Add extra source JARs + --resource-dirs paths Add a resource directory + -J, --java-opt java-options Set Java options, such as -Xmx1g + --java-prop key=value|key Set Java properties + +Logging options: + -v, --verbose Increase verbosity (can be specified multiple times) + -q, --quiet Decrease verbosity + --progress Use progress bars + +Entrypoint options: + -M, --main-class Specify which main class to run + --list-main-class List main classes available + +Dependency options: + -d, --dep, --dependency string Add dependencies + -r, --repo, --repository string Add repositories + +Other options: + -i, --interactive Interactive mode + -w, --watch Watch source files for changes + --restart, --revolver Run your application in background + and restart if sources have changed +\end{REPLsmall} + +\end{itemize} + + + +Läs mer om Scala CLI här: \url{https://scala-cli.virtuslab.org/} + % \begin{table} % \renewcommand{\arraystretch}{1.25}\centering @@ -295,8 +420,7 @@ \subsection{Scala Read-Evaluate-Print-Loop (REPL)}\label{appendix:compile:REPL} % \begin{tabular}{r | c | l} % \textit{Kommando} & \textit{Förk.} & \textit{Beskrivning} \\ \hline % \texttt{:help} & \texttt{:he} & visa lista med kommando och förklaringar\\ -% \texttt{:paste} & \texttt{:pa} & växla till inklistringsläge \Eng{paste mode}\\ -% \texttt{:paste} \textit{path} & \texttt{:pa} \textit{path} & klistra in en hel fil, t.ex. \code|:pa util/mio.scala|\\ +% \texttt{:load} \textit{path} & \texttt{:load} \textit{path} & klistra in en hel fil, t.ex. \code|:load util/mio.scala|\\ % \texttt{:quit} & \texttt{:q} & avsluta Scala REPL \\ % \texttt{:require} \textit{path} & \texttt{:req} \textit{path} & jar-fil till classpath, t.ex. \texttt{:req lib/cslib.jar}\\ diff --git a/compendium/postchapters/debug.tex b/compendium/postchapters/debug.tex index 62342298c..a63b07e96 100644 --- a/compendium/postchapters/debug.tex +++ b/compendium/postchapters/debug.tex @@ -217,7 +217,7 @@ \section{Använda en debugger}\label{section:debugging} \end{itemize} -\noindent I Kojo (se appendix \ref{appendix:kojo}) finns enkla debug-funktioner. Man kan till exempel följa stegen i exekveringen med hjälp av den brandgula play-knappen ''Kör och spåra programmet'' (kortkommando: Alt+Enter). Då öppnas ett nytt fönster som visar exekveringsstegen. Man kan klicka på ett steg och få information om parametrar vid funktionsanrop etc. +\noindent I Kojo Desktop (se appendix \ref{appendix:kojo}) finns lättanvända debug-funktioner. Man kan till exempel följa stegen i exekveringen med hjälp av den brandgula play-knappen ''Kör och spåra programmet'' (kortkommando: Alt+Enter). Då öppnas ett nytt fönster som visar exekveringsstegen. Man kan klicka på ett steg och få information om parametrar vid funktionsanrop etc. Du kan läsa mer om hur man använder en avancerad debugger i en professionell integrerad utvecklingsmiljö i appendix \ref{appendix:ide}. diff --git a/compendium/postchapters/ide-intellij-idea.tex b/compendium/postchapters/ide-intellij-idea.tex index 458e3108c..ebd2f2d4d 100644 --- a/compendium/postchapters/ide-intellij-idea.tex +++ b/compendium/postchapters/ide-intellij-idea.tex @@ -9,6 +9,13 @@ \section{JetBrains IntelliJ IDEA med Scala-plugin}\label{appendix:ide:intellij} IntelliJ IDEA finns i två varianter: en gratis gemenskapsvariant med öppenkällkodslicens \Eng{Community edition}, samt en betalvariant med sluten källkod och support-tjänster. +\begin{figure} +\centering +\includegraphics[width=1.0\textwidth]{../img/intellij/idea-hello} +\caption{Den integrerade utvecklingsmiljön Intellij IDEA.\label{appendix-ide:intellij-hello}} +\end{figure} + + IntelliJ IDEA är en omfattande och avancerad programmeringsmiljö med många funktioner och inställningar. Det finns även en omfattande uppsättning insticksmoduler och tilläggsprogram som underlättar utveckling av t.ex. mobilappar, webbprogram, databaser och mycket annat. @@ -32,6 +39,7 @@ \subsection{Installera IntelliJ IDEA}\label{appendix:ide:intellij:install} \url{https://www.jetbrains.com/help/idea/discover-intellij-idea-for-scala.html} + % \subsubsection{Ladda ner IntelliJ Scala Bundle (Rekommenderas)} % Om du vill installera IntelliJ med Scala på din egen dator gör du det enklast med paketet \emph{IntelliJ Scala Bundle} via nedan länk för Windows, Mac respektive Linux. Välj senaste versionen med Scala \ScalaVersion.x: diff --git a/compendium/postchapters/ide-vscode.tex b/compendium/postchapters/ide-vscode.tex index c3f1e2c95..e41e31d3e 100644 --- a/compendium/postchapters/ide-vscode.tex +++ b/compendium/postchapters/ide-vscode.tex @@ -1,21 +1,27 @@ %!TEX encoding = UTF-8 Unicode %!TEX root = ../compendium2.tex -\section{Visual Studio Code med Scala-tillägget Metals}\label{appendix:ide:vscode} +\section{Visual Studio Code med tillägget Scala Metals}\label{appendix:ide:vscode} -Visual Studio Code\footnote{\href{https://en.wikipedia.org/wiki/Visual\_Studio\_Code}{en.wikipedia.org/wiki/Visual\_Studio\_Code}}, förkortat VS Code eller bara \code{code}, är en gratis utvecklingsmiljö som är mestadels öppen källkod\footnote{Varianten VS Codium \url{https://vscodium.com/} är helt fri från stängd källkod.}. Projektet startades och leds av Microsoft och har en aktiv gemenskap med många utvecklare och många användbara tillägg \Eng{extensions}. +Visual Studio Code\footnote{\href{https://en.wikipedia.org/wiki/Visual\_Studio\_Code}{en.wikipedia.org/wiki/Visual\_Studio\_Code}}, förkortat VS Code eller bara \code{code}, är en gratis utvecklingsmiljö som är mestadels öppen källkod\footnote{Varianten VS Codium \url{https://vscodium.com/} är helt fri från stängd källkod och telemetri.}. Projektet startades och leds av Microsoft och har en aktiv gemenskap med många utvecklare och många användbara tillägg \Eng{extensions}. VS Code kallas ofta för ''bara'' en editor, men har genom åren utvecklats till en fullfjädrad IDE med bl.a. inbyggd debugger och stöd för många olika språk via ett omfattande bibliotek av tillägg.% - -Du kan aktivera debuggern i VS Code för dina Scala-program genom att klicka på ''debug'' ovanför din \code{main}-metod, förutsatt att du har tillägget Metals installerad i VS Code och en aktiverad och giltig \code{build.sbt}-fil. Läs mer om debugging i Appendix \ref{appendix:debug}. - +\begin{itemize} +\item Läs mer om hur man använder VS Code här: \\ \url{https://code.visualstudio.com/docs} +\item Läs mer om hur du använder Scala i VS Code här: \\ \url{https://scalameta.org/metals/docs/editors/vscode} +\end{itemize} + +Det finns många användbara kortkommandon som gör dig snabbare och snabbare när du kodar, allteftersom du lär dig nya kortkommandon. Ett bra tips är att du lär dig minst ett nytt kortkommando om dagen och efter ett tag kan du riktigt många. Här finns en sammanfattning av de viktigaste kortkommandona för VS Code för Linux:\\ +\url{https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf}\\ +Byt ut \code{linux} mot \code{windows} eller \code{macos} i adressen ovan för motsvarande plattform. + \subsection{Installera VS Code och Metals}\label{appendix:ide:vscode:install} VS Code är förinstallerad på LTH:s datorer, men du behöver själv installera Scala-tillägget \textbf{Metals} första gången du kör igång VS Code på LTH:s datorer. Läs om installation av Metals här: \\ @@ -26,3 +32,56 @@ \subsection{Installera VS Code och Metals}\label{appendix:ide:vscode:install} Mer information om installation av verktyg finns på kursens hemsida: \\ \url{https://cs.lth.se/pgk/verktyg} +\begin{figure} +\centering +\includegraphics[width=1.0\textwidth]{../img/vscode-run} +\caption{Kör program med \textsf{run}. Ett blått meddelandefält indikerar projektläge. \label{appendix-ide:vscode-run}} +\end{figure} + +\subsection{Köra program i VS Code} + +Det finns olika sätt att köra igång huvudprogrammet i ett projekt i VS Code: + +\begin{enumerate} + \item Använd \texttt{scala-cli run .} i ett separat terminalfönster. Läs mer om \texttt{scala-cli} i Appendix \ref{appendix:compile:scala-cli}. + \item Kör igång \texttt{sbt} i ett separat terminalfönster och kör kommandot \texttt{run} inifrån \texttt{sbt}. Detta kräver att du har en giltig \texttt{build.sbt}, se Appendix \ref{appendix:build}. + \item Köra igång program inifrån VS Code. Detta kräver att du öppnat katalogen med din kod med File-menyns ''Open Folder'', eller genom att du startar VS Code med \texttt{code .} överst i din projektkatalog (du ser att detta är gjort om nedre meddelandefältet är blått i stället för lila). Du behöver \textit{innan} du startar VS Code en första gång köra \texttt{scala-cli setup-ide .} (se Appendix \ref{appendix:compile:scala-cli}), eller skapa en giltig \code{build.sbt}-fil (se Appendix \ref{appendix:build}) som du importerar i VS Code när frågan dyker upp i nedre högra hörnet. + \item Kombinera Scala CLI eller \code{sbt} och VS Code. Kör detta kommando i ett separat terminalfönster: \texttt{scala-cli compile . -w}~~ där \texttt{-w} betyder \emph{watch} och gör så att ändringar bevakas. Om du istället använder \texttt{sbt} kör \code{sbt ~compile} i ett separat terminalfönster (notera tilde-tecknet som gör att ändringar bevakas). Vid ändringsbevakning kommer kompileringsfel visas där varje gång du sparar en ändring i VS Code med Ctrl+S. När alla kompileringsfel är åtgärdade och du är redo att testköra så klickar du på \textsf{run}. +\end{enumerate} + +Du ser att VS Code är beredd att köra igång ditt program genom att det (efter ett tag) kommer upp en extra rad ovanför ditt huvudprogram med texten \textsf{run|debug} och då kan du klicka på \textsf{run} för att köra ditt program. Utdata från körningen visas i en flik under koden. Observera att det kan ta lite tid för VS Code att förbereda allt som behövs för att kunna köra ditt program. Håll koll på om VS Code håller på med dessa förberedelser i det blåa meddelandefältet längst ned till höger. När allt är klart efter att du startat VS Code står det ''Index complete!'' bredvid en raketsymbol i meddelandefältet. + +Om något krånglar och du inte får fram \textsf{run|debug} ovanför din \code{@main}-funktion, trots du har startat VS code enligt ovan, så prova att under Metals-fliken (ikonen med det stiliserade M:et i det gröna verktygsfältet) klicka på någon av ''Restart build server'' eller ''Import build'' (den senare tar längre tid men börjar om helt) och vänta tills det står ''Index Complete!'' i det blå meddelandefältet och då ska \textsf{run|debug} synas ovanför din \code{@main}-funktion. + +\begin{figure} +\centering +\includegraphics[width=1.0\textwidth]{../img/vscode-debug} +\caption{Debuggern i VS Code. Nederkanten är orange när debuggern kör. \label{appendix-ide:vscode-debug}} +\end{figure} + +\subsection{Använda debuggern i VS Code} + +Innan du börjar använda debuggern, läs först om allmän felhantering i Appendix \ref{appendix:debug}. + +Du kan aktivera debuggern i VS Code för dina Scala-program genom att klicka på ''debug'' ovanför din \code{main}-metod, förutsatt att du har tillägget Metals installerad i VS Code. Du behöver även köra \texttt{scala-cli setup-ide .} en första gång (se Appendix \ref{appendix:compile:scala-cli}), eller ha en giltig \code{build.sbt}-fil (se Appendix \ref{appendix:build}) som du importerar i VS Code när frågan dyker upp i nedre högra hörnet. + +Figur \ref{appendix-ide:vscode-debug} på sidan \pageref{appendix-ide:vscode-debug} visar hur det kan se ut när debuggern i VS Code är aktiverad. När debuggern är igång får det nedersta meddelandefältet en orange färg (istället för blå). Till vänster om radnummerkolumnen kan du klicka för att aktivera och avaktivera brytpunkter. Aktiverade brytpunkter visas som en röd prick i marginalen till vänster. Den ihåliga gula pilen i marginalen pekar på den rad som kommer att exekveras härnäst. Notera panelen med olika knappar i överkanten av editorfönstret. Med dessa knappar kan du styra exekveringen enligt följande (lär dig gärna kortkommandona så blir du snabbare): +\begin{itemize} + \item \textbf{Fortsätt}. Den blåa play-knappen kör vidare till nästa brytpunkt eller tills programmet är klart om brytpunkt ej påträffas. Kortkommando ''Continue'': F5. + \item \textbf{Stega över}.Den blåa böjda framåtpilen kör en rad i taget \emph{utan} att hoppa in i funktioner. Kortkommando ''Step Over'': F10. + \item \textbf{Stega in}. Den blåa nedåtpilen kör vidare en rad i taget och hoppar in i funktioner om raden innehåller funktionsanrop. Kortkommando ''Step Into'': F11. + \item \textbf{Stega ut}. Den blåa uppåtpilen kör klar innevarande funktion. Kortkommando ''Step Out'': Shift+F11. + \item \textbf{Kör igen}. Den gröna återstartsikonen kör om ditt program. Kortkommando ''Restart'': Ctrl+Shift+F5. + \item \textbf{Avbryt}. Den röda stoppknappen avbryter denna debuggingsession. Kom ihåg att avbryta innan du startar en ny debuggingsession, annars kan det lätt bli förvirrande med många samtidigt pågående körningar. Kortkommando ''Stop'': Shift+F5. +\end{itemize} + +Figur \ref{appendix-ide:vscode-trace} på sidan \pageref{appendix-ide:vscode-trace} visar hur VS Code presenterar anropsstacken och värdet på de variabler som syns där exekveringen befinner sig för tillfället. Du får fram detta genom att klicka på ikonen med en lus och en playknapp i det vertikala, gröna verktygsfältet längst till vänster. I en blå ring står en etta om du har startat en debuggingsession. Om det står en tvåa eller mer så har du flera sessioner igång och då kan det vara klokt att avsluta alla utom en, så att inte förvirring uppstår om vilken session som är den aktuella. + +\begin{figure} +\centering +\includegraphics[width=1.0\textwidth]{../img/vscode-trace} +\caption{Anropsstack och variabler i VS Code.\label{appendix-ide:vscode-trace}} +\end{figure} + +Mycket av konsten i debugging handlar om att undersöka variablers värde under exekveringen för att ta reda på om din hypotes om vad som händer under exekvering verkligen stämmer, eller om något egentligen inte fungerar så som du antar. Detta kan du med fördel göra genom att placera brytpunkter på relevanta ställen. Även vid användning av en debugger kan du ha stor nytta av att göra \code{println} av intressanta uttryck för att i detalj undersöka vad som egentligen händer. Läs mer om debugging i Appendix \ref{appendix:debug}. + \ No newline at end of file diff --git a/compendium/postchapters/java-lab.tex b/compendium/postchapters/java-lab.tex index 62b721657..1b2a4afc6 100644 --- a/compendium/postchapters/java-lab.tex +++ b/compendium/postchapters/java-lab.tex @@ -29,7 +29,7 @@ \subsection{Krav} % \item Speltiden för varje spelomgång ska mätas och sparas tillsammans med poängresultatet för respektive spelare. \item Koden för själva spelet ska vara skriven i Java, men Scala ska användas för att implementera funktionerna i singelobjektet \code{UserInterface}. \item I Scala-koden ska du för träningens skull använda Java-klassen \code{java.util.Scanner} när du läser in data från terminalen. - \item Koden i singelobjektet \code{UserInterface} ska använda omvandlingsmetoden \code{asScala} efter \code{import scala.jdk.CollectionConverters._} för att omvandla argument av typen \code{java.util.ArrayList}. + \item Koden i singelobjektet \code{UserInterface} ska använda omvandlingsmetoden \code{asScala} efter \code{import scala.jdk.CollectionConverters._} för att omvandla argument av typen \code{java.util.ArrayList} till \code{scala.collection.mutable.Buffer}\footnote{Notera att \code{asJava} på \code{Buffer} ger en Java-samling av typen \code{List}.}. \item Ditt spel ska i Java-kod använda minst en av datastrukturerna \code{ArrayList}, \code{HashSet}, diff --git a/compendium/postchapters/kojo-commands.tex b/compendium/postchapters/kojo-commands.tex index c4334507f..f5acdc42e 100644 --- a/compendium/postchapters/kojo-commands.tex +++ b/compendium/postchapters/kojo-commands.tex @@ -1,15 +1,15 @@ -\code|sudda| \newline \code|clear| & Ritfönstret suddas \\ -\code|fram| \newline \code|forward(25)| & Paddan går framåt 25 steg. \\ +\code|sudda| \newline \code|clear()| & Ritfönstret suddas \\ +\code|fram| \newline \code|forward()| & Paddan går framåt 25 steg. \\ \code|fram(100)| \newline \code|forward(100)| & Paddan går framåt 100 steg. \\ \code|höger| \newline \code|right(90)| & Paddan vrider sig 90 grader åt höger. \\ \code|höger(45)| \newline \code|right(45)| & Paddan vrider sig 45 grader åt höger. \\ \code|vänster| \newline \code|left(90)| & Paddan vrider sig 90 grader åt vänster. \\ \code|vänster(45)| \newline \code|left(45)| & Paddan vrider sig 45 grader åt vänster. \\ -\code|hoppa| \newline \code|hop| & Paddan hoppar 25 steg utan att rita. \\ +\code|hoppa| \newline \code|hop()| & Paddan hoppar 25 steg utan att rita. \\ \code|hoppa(100)| \newline \code|hop(100)| & Paddan hoppar 100 steg utan att rita. \\ \code|hoppaTill(100, 200)| \newline \code|jumpTo(100, 200)| & Paddan hoppar till läget (100, 200) utan att rita. \\ \code|gåTill(100, 200)| \newline \code|moveTo(100, 200)| & Paddan vrider sig och går till läget (100, 200). \\ -\code|hem| \newline \code|home| & Paddan går tillbaka till utgångsläget (0, 0). \\ +\code|hem| \newline \code|home()| & Paddan går tillbaka till utgångsläget (0, 0). \\ \code|öster| \newline \code|setHeading(0)| & Paddan vrider sig så att nosen pekar åt höger. \\ \code|väster| \newline \code|setHeading(180)| & Paddan vrider sig så att nosen pekar åt vänster. \\ \code|norr| \newline \code|setHeading(90)| & Paddan vrider sig så att nosen pekar uppåt. \\ @@ -18,33 +18,32 @@ \code|sättVinkel(90)| \newline \code|setHeading(90)| & Paddan vrider nosen till vinkeln 90 grader. \\ \code|vinkel| \newline \code|heading| & Ger vinkelvärdet dit paddans nos pekar. \\ \code|sakta(5000)| \newline \code|setAnimationDelay(5000) | & Gör så att paddan ritar jättesakta. \\ -\code|suddaUtdata| \newline \code|clearOutput| & Utdatafönstret suddas. \\ -\code|utdata("hej")| \newline \code|println("hej")| & Skriver texten \texttt{hej} i utdatafönstret. \\ -\code|val t = indata("Skriv")| \newline \code|val t = readln("Skriv:")| & Väntar på inmatning efter ledtexten \texttt{Skriv} och sparar den inmatade texten i t. \\ +\code|println("hej")| & Skriver texten \texttt{hej}. \\ +%\code|val t = indata("Skriv")| \newline \code|val t = readln("Skriv:")| & Väntar på inmatning efter ledtexten \texttt{Skriv} och sparar den inmatade texten i t. \\ \code|textstorlek(100)| \newline \code|setPenFontSize(100)| & Paddan skriver med jättestor text nästa gång du gör skriv. \\ \code|båge(100, 90)| \newline \code|arc(100, 90)| & Paddan ritar en båge med radie 100 och vinkel 90. \\ \code|cirkel(100)| \newline \code|circle(radie)| & Paddan ritar en cirkel med radie 100. \\ -\code|synlig| \newline \code|visible| & Paddan blir synlig. \\ -\code|osynlig| \newline \code|invisible| & Paddan blir osynlig. \\ +\code|synlig| \newline \code|visible()| & Paddan blir synlig. \\ +\code|osynlig| \newline \code|invisible()| & Paddan blir osynlig. \\ \code|läge.x| \newline \code|position.x| & Ger paddans x-läge \\ \code|läge.y| \newline \code|position.y| & Ger paddans y-läge \\ -\code|pennaNer| \newline \code|penDown| & Sätter ner paddans penna så att den ritar när den går. \\ -\code|pennaUpp| \newline \code|penUp| & Lyfter upp paddans penna så att den INTE ritar när den går. \\ -\code|pennanÄrNere| \newline \code|penIsDown| & Kollar om pennan är nere eller inte. \\ +\code|pennaNer| \newline \code|penDown()| & Sätter ner paddans penna så att den ritar när den går. \\ +\code|pennaUpp| \newline \code|penUp()| & Lyfter upp paddans penna så att den INTE ritar när den går. \\ +\code|pennanÄrNere| & Kollar om pennan är nere eller inte. \\ \code|färg(rosa)| \newline \code|setPenColor(pink)| & Sätter pennans färg till rosa. \\ \code|fyll(lila)| \newline \code|setFillColor(purple)| & Sätter ifyllnadsfärgen till lila. \\ \code|fyll(genomskinlig)| \newline \code|setFillColor(noColor)| & Gör så att paddan inte fyller i något när den ritar. \\ \code|bredd(20)| \newline \code|setPenThickness(20)| & Gör så att pennan får bredden 20. \\ -\code|sparaStil| \newline \code|saveStyle| & Sparar pennans färg, bredd och fyllfärg. \\ -\code|laddaStil| \newline \code|restoreStyle| & Laddar tidigare sparad färg, bredd och fyllfärg. \\ -\code|sparaLägeRiktning| \newline \code|savePosHe| & Sparar pennans läge och riktning \\ -\code|laddaLägeRiktning| \newline \code|restorePosHe| & Laddar tidigare sparad riktning och läge \\ -\code|siktePå| \newline \code|beamsOn| & Sätter på siktet. \\ -\code|sikteAv| \newline \code|beamsOff| & Stänger av siktet. \\ +\code|sparaStil| \newline \code|saveStyle()| & Sparar pennans färg, bredd och fyllfärg. \\ +\code|laddaStil| \newline \code|restoreStyle()| & Laddar tidigare sparad färg, bredd och fyllfärg. \\ +\code|sparaLägeRiktning| \newline \code|savePosHe()| & Sparar pennans läge och riktning \\ +\code|laddaLägeRiktning| \newline \code|restorePosHe()| & Laddar tidigare sparad riktning och läge \\ +\code|siktePå| \newline \code|beamsOn()| & Sätter på siktet. \\ +\code|sikteAv| \newline \code|beamsOff()| & Stänger av siktet. \\ \code|bakgrund(svart)| \newline \code|setBackground(black)| & Bakgrundsfärgen blir svart. \\ \code|bakgrund2(grön,gul)| \newline \code|setBackgroundV(green, yellow)| & Bakgrund med övergång från grönt till gult. \\ \code|upprepa(4){fram; höger}| \newline \code|repeat(4){forward; right}| & Paddan går fram och svänger höger 4 gånger. \\ -\code|avrunda(3.99)| & Avrundar 3.99 till 4.0 \\ +\code|avrunda(3.99, 2)| & Avrundar 3.99 till två decimaler, alltså 4.0 \\ \code|slumptal(100)| & Ger ett slumptal mellan 0 och 99. \\ \code|slumptalMedDecimaler(100)| & Ger ett slumptal mellan 0 och 99.99999999 \\ \code|systemtid| & Ger nuvarande systemklocka i sekunder. \\ diff --git a/compendium/postchapters/kojo.tex b/compendium/postchapters/kojo.tex index 35432537f..bd4f090fc 100644 --- a/compendium/postchapters/kojo.tex +++ b/compendium/postchapters/kojo.tex @@ -7,9 +7,11 @@ \section{Vad är Kojo?} Kojo% \footnote{\href{https://en.wikipedia.org/wiki/Kojo_(programming_language)}{en.wikipedia.org/wiki/Kojo\_(programming\_language)}} - är en integrerad utvecklingsmiljö för Scala som är speciellt anpassad för nybörjare i programmering. Kojo används i LTH:s Science Center Vattenhallen för utbildning av grundskolelärare i programmering och vid skolbesök och annan besöksverksamhet, i vilken lärare och studenter vid LTH arbetar som handledare. Kojo är fri öppenkällkod och utvecklingsgemenskapen leds av Lalit Pant från Indien. + är en integrerad utvecklingsmiljö för Scala som är speciellt anpassad för programmeringsundervisning i grundskolan. Kojo används i LTH:s Science Center Vattenhallen för utbildning av grundskolelärare i programmering och vid skolbesök och annan besöksverksamhet, i vilken lärare och studenter vid LTH arbetar som handledare. + + Kojo är öppen källkod och utvecklingsgemenskapen leds av Lalit Pant från Indien. I Kojo finns även lättillgängliga bibliotek som gör tröskeln lägre att programmera rörlig grafik och enkla spel. -Kursens första laboration genomförs med hjälp av Kojo, men Kojo kan med fördel användas som komplement till Scala REPL och annan IDE under hela kursens gång. Medan Scala REPL lämpar sig för korta kodsnuttar, och en fullfjädrad, professionell IDE har funktioner för att hantera riktigt stora programmeringsprojekt, passar Kojo bra för mellanstora program. I Kojo finns även lättillgängliga bibliotek som gör tröskeln lägre att programmera rörlig grafik och enkla spel. +Under kursens första laboration använder vi grafikbiblioteket i Kojo för att illustrera grundläggande begrepp, så som sekvens, alternativ, repetition och abstraktion. \begin{figure}[H] @@ -19,39 +21,91 @@ \section{Vad är Kojo?} \label{fig:appendix:ide:kojo} \end{figure} -\subsection{Installera Kojo}\label{appendix:ide:kojo:install} +\section{Använda grafikbiblioteket i Kojo}\label{appendix:ide:kojo:install} + +Kojo bygger på den beprövade pedagogiska idén med sköldpaddsgrafik \Eng{turtle graphics}\footnote{\url{https://en.wikipedia.org/wiki/Turtle_graphics}}, där du skriver program som styr en sköldpadda med en penna under magen. När sköldpaddan rör sig bildas ett streck av valfri färg på skärmen. Beroende på hur du bestämmer att sköldpaddan ska röra sig och vilken färg du bestämmer att pennan ska ha, kan du skapa olika intressanta bilder och samtidigt lära dig om programmeringens grunder. + +Under kursens första laboration ska du använda grafikbiblioteket i Kojo tillsammans med editorn VS \code{code} och \code{scala-cli} i terminalen (se appendix \ref{appendix:terminal} och \ref{appendix:compile}). Ladda ner filen \texttt{kojolib.scala} från \url{https://fileadmin.cs.lth.se/kojolib.scala} och spara i en ny katalog med hjälp av din webbläsare, eller via dessa kommandon (notera att det är stora bokstaven \code{O} och inte en nolla i optionen \code{-sLO}): + +\begin{REPLnonum} +> mkdir w01-kojo +> cd w01-kojo +> curl -sLO https://fileadmin.cs.lth.se/kojolib.scala +\end{REPLnonum} + +Nu kan du starta Scala REPL och rita med Kojo så här: + +\begin{REPLnonum} +> scala-cli repl . +Welcome to Scala 3.1.2 (17.0.2, Java OpenJDK 64-Bit Server VM). +Type in expressions for evaluation. Or try :help. + +scala> fram; höger; fram; vänster + +\end{REPLnonum} + +Du kan starta VS \code{code} i aktuellt bibliotek så här: +\begin{REPLnonum} +> code . +\end{REPLnonum} + +Skriv nedan progam i VS \code{code} och spara det i samma katalog som den tidigare nedladdade filen, under ett nytt valfritt filnamn, t.ex. \code{rita.scala}: + +\begin{Code} +@main def rita = fram; höger; fram; vänster +\end{Code} + +Kör ditt fristående program med: +\begin{REPLnonum} +> scala-cli run . +\end{REPLnonum} + +Du ska nu få upp ett fönster som heter Kojo Canvas med en sköldpadda som ritat två streck. När du stänger fönstret så avslutas programmet. Prova fler sköldpaddsfunktioner enligt tabell \ref{table:kojo:functions}. + +I stället för att ladda ned filen \code{kojolib.scala} så kan du placera dess innehåll på lämpligt ställe i ditt program enligt nedan. Observera att raden som börjar med \code{//> using lib} ska vara en enda lång rad utan radbrytningar.%\code{export} gör Kojos kommandon tillgängliga utan prefix: +\lstinputlisting[breaklines=true,basicstyle=\ttfamily\fontsize{9}{11}\selectfont]{../workspace/w01_kojo/kojo.scala} + +\noindent Scala-koden för den svenska paddans api finns här: \\ +%\href{https://github.com/litan/kojo/blob/master/src/main/scala/net/kogics/kojo/lite/i18n/svInit.scala}{github.com/litan/kojo/blob/master/src/main/scala/net/kogics/kojo/lite/i18n/svInit.scala} \\ +\href{https://github.com/litan/kojo-lib/blob/main/src/main/scala/net/kogics/kojo/i18n/Swedish.scala}{github.com/litan/kojo-lib/blob/main/src/main/scala/net/kogics/kojo/i18n/Swedish.scala} -Kojo är förinstallerat på LTH:s datorer och körs igång med kommandot \texttt{kojo}. För instruktioner om hur du installerar Kojo på din egen dator se här:\\ -\href{http://www.lth.se/programmera/installera/}{lth.se/programmera/installera} %Kojo kräver (numera) \emph{inte} att \texttt{java} finns på din dator utan kommer med en egen JVM. %Eftersom du behöver tillgång till JDK i kursen, är det lika bra att installera hela JDK direkt (och inte bara JRE, så som beskrivs å länken ovan); se vidare hur du gör detta i avsnitt \ref{appendix:compile:install-jdk}. %\href{http://www.kogics.net/kojo-download}{www.kogics.net/kojo-download} -\section{Använda Kojo} -När du startar Kojo första gången, välj ''Svenska'' i språkmenyn och starta om Kojo. Därefter fungerar grafikfunktionerna på svenska enligt tabell \ref{table:kojo:functions}. När du startat om Kojo inställt på svenska ser programmet ut ungefär som i figur \ref{fig:appendix:ide:kojo} på sidan \pageref{fig:appendix:ide:kojo}. +\section{Kojo Desktop} +Kojo finns som fristående skrivbordsapplikation, kallad Kojo Desktop. Kojo Desktop innehåller en egen editor med syntaxfärgning för Scala, men fungerar ännu så länge bara för Scala 2. En av de synligaste skillnaderna mellan Scala 2 och Scala 3 är att klammerparenteser vid flerradiga funktioner är nödvändiga i Scala 2, medan Scala 3 har valfria klammerparenteser. Så om du använder Kojo Desktop behöver du komma ihåg att omgärda sekvenser av rader som hör ihop med \code|{| och \code|}|. -Det finns ett antal användbara kortkommando som du hittar i menyerna i Kojo. Undersök speciellt Ctrl+Alt+Mellanslag som ger autokomplettering baserat på det du börjat skriva. +Kojo Desktop är förinstallerad på LTH:s datorer och körs igång med terminalkommandot \texttt{kojo} eller via applikationsmenyn. För instruktioner om hur du installerar Kojo Desktop på din egen dator se här: \href{http://www.lth.se/programmera/installera/}{lth.se/programmera/installera} +När du startar Kojo första gången, välj ''Svenska'' i språkmenyn och starta om Kojo. Därefter fungerar grafikfunktionerna på svenska enligt tabell \ref{table:kojo:functions} på sidan \pageref{table:kojo:functions}. När du startat om Kojo inställt på svenska ser programmet ut ungefär som i figur \ref{fig:appendix:ide:kojo} på sidan \pageref{fig:appendix:ide:kojo}. -{\small\renewcommand{\arraystretch}{1.45} -\begin{longtable}{@{}p{0.42\textwidth} p{0.55\textwidth}} +Det finns ett antal användbara kortkommando som du hittar i menyerna i Kojo Desktop. Undersök speciellt Ctrl+Alt+Mellanslag som ger autokomplettering baserat på det du börjat skriva. -\caption{Några av sköldpaddans funktioner. Se även \href{http://lth.se/programmera}{lth.se/programmera}}\label{table:kojo:functions}\\ +\section{Kojo i Webbläsaren} -\emph{Svenska/Engelska} & \emph{Vad händer?} \\ \hline -\input{postchapters/kojo-commands.tex} +En begränsad variant av Kojo finns tillgänglig för programmering direkt i din webbläsare här: \url{http://kojo.lu.se/} -\hline -\end{longtable} -}%end small +När du trycker på play-knappen så kompileras din kod på en server till Javascript via ScalaJS och därefter körs Javascript-koden i din webbläsare. +Kojo på webben är också ännu så länge begränsad till Scala 2 och kräver att du omgärdar sekvenser av rader som hör ihop med \code|{| och \code|}|. -\noindent Scala-koden för den svenska paddans api finns här: \\ -\href{https://github.com/litan/kojo/blob/master/src/main/scala/net/kogics/kojo/lite/i18n/svInit.scala}{github.com/litan/kojo/blob/master/src/main/scala/net/kogics/kojo/lite/i18n/svInit.scala} \section{Mer om Kojo} I detta dokument finns en enkel introduktion till Kojo: \\ ''Introduction to Kojo'' \url{http://www.kogics.net/kojo-ebooks#intro} + +\noindent I tabell \ref{table:kojo:functions}, som fortsätter på efterföljande sidor, finns ett urval av kommando i Kojo på svenska och engelska. + +{\small\renewcommand{\arraystretch}{1.4} +\begin{longtable}{@{}p{0.42\textwidth} p{0.55\textwidth}} + +\caption{Ett urval av funktioner i Kojo. Se även \href{http://lth.se/programmera}{lth.se/programmera}}\label{table:kojo:functions}\\ + +\emph{Svenska/Engelska} & \emph{Vad händer?} \\ \hline +\input{postchapters/kojo-commands.tex} +\end{longtable} +}%end small diff --git a/compendium/postchapters/terminal.tex b/compendium/postchapters/terminal.tex index f00f969bd..2390025db 100644 --- a/compendium/postchapters/terminal.tex +++ b/compendium/postchapters/terminal.tex @@ -48,17 +48,44 @@ \subsubsection{Terminal i Linux} \subsubsection{PowerShell, Cmd och Linux i Microsoft Windows} -Microsoft Windows är inte Linux-baserat, men i kommandotolken \textbf{Powershell} finns alias definierade för några vanliga Linux-kommandon, inkluderat \texttt{ls}, \texttt{cd} och \texttt{pwd}. -Du startar Powershell t.ex. genom att trycka på Windows-knappen och skriva \texttt{powershell}. -Du kan också, medan du bläddrar bland filer, klicka på filnamnsraden överst i filbläddraren och skriva \texttt{powershell} och tryck Enter; då startas Powershell i aktuellt katalog. Ändra gärna typsnitt och bakgrundsfärg med hjälp av fönstrets menyer, så att det blir lättare för dig att läsa vad som skrivs. +Det finns flera olika sätt att köra terminalkommando i Windows: -Det finns även i Windows den ursprungliga kommandotolken \textbf{Cmd} med helt andra kommandon. Till exempel skriver man i Cmd kommandot \texttt{dir} i stället för \texttt{ls} för att lista filer. +\begin{itemize} +\item \textbf{Powershell}. I Microsoft Windows finns kommandotolken \textit{Powershell} med speciell kommandosyntax. Den är inte Linux-baserad men det finns alias definierade för några vanliga Linux-kommandon, inkluderat \texttt{ls}, \texttt{cd} och \texttt{pwd}. Du startar Powershell t.ex. genom att trycka på Windows-knappen och skriva \texttt{powershell}. +Du kan också, medan du bläddrar bland filer, klicka på filnamnsraden överst i filbläddraren och skriva \texttt{powershell} och tryck Enter; då startas Powershell i aktuellt katalog. %Ändra gärna typsnitt och bakgrundsfärg med hjälp av fönstrets menyer, så att det blir lättare för dig att läsa vad som skrivs. -I Windows 10 kan du (numera, om du installerad senaste uppdateringarna av Windows) även köra Ubuntu-terminalen med hjälp av Windows Linux Subsystem (WSL). Se vidare här om hur du kan installera WSL under Windows 10: +\item \textbf{Cmd}. Det finns även i Windows den ursprungliga, gamla kommandotolken \textit{Cmd} med helt andra kommandon. Till exempel skriver man i Cmd kommandot \texttt{dir} i stället för \texttt{ls} för att lista filer. -\url{https://ubuntu.com/wsl} +\item \textbf{WSL}. I både Windows 10 och 11 kan du även köra Ubuntu-terminalen med hjälp av Windows Linux Subsystem (WSL), vilket rekommenderas, speciellt om du inte har möjlighet att göra s.k. dual boot\footnote{Läs mer om dual boot här och be gärna någon om hjälp som gjort det förr:\\ \href{https://www.linuxtechi.com/dual-boot-ubuntu-22-04-and-windows-11/}{https://www.linuxtechi.com/dual-boot-ubuntu-22-04-and-windows-11/}}. -Läs mer här: \href{https://www.omgubuntu.co.uk/2020/03/windows-10-linux-kernel-update}{www.omgubuntu.co.uk/2020/03/windows-10-linux-kernel-update} + + + +\begin{itemize}[nolistsep] +\item Se vidare här om hur du kan installera WSL under Windows, (WSL2 rekommenderas före WSL1 om din maskin klarar det): + +\url{https://docs.microsoft.com/en-us/windows/wsl/install} + +\item Det finns även ett smidigt tillägg till VS Code som heter Remote-WSL som gör att du kan editera filer i Windows som finns i WSL, se vidare här: + +\url{https://code.visualstudio.com/docs/remote/wsl-tutorial} + +\end{itemize} + +\item \textbf{Windows Terminal}. Den nya Microsoft-appen \textit{Windows Terminal} rekommenderas oavsett om du använder Powershell, Cmd eller WSL. Läs mer här om hur du installerar Windows Terminal: \\ + \url{https://docs.microsoft.com/en-us/windows/terminal/} + +\end{itemize} + + + + + + + +% \url{https://ubuntu.com/wsl} + +% Läs mer här: \href{https://www.omgubuntu.co.uk/2020/03/windows-10-linux-kernel-update}{www.omgubuntu.co.uk/2020/03/windows-10-linux-kernel-update} @@ -85,7 +112,7 @@ \section{Vad är en path/sökväg?}\label{terminal:path} Alla operativsystem håller reda på en mängd olika sökvägar för att kunna hitta speciella filer i filträdet. Dessa sökvägar lagras i s.k. \textbf{miljövariabler} \Eng{environment variables}. Det finns en \textit{speciell} miljövariabel som heter kort och gott \textbf{PATH}, i vilken alla sökvägar till de program finns, som ska vara tillgängliga för din användaridentitet direkt för exekvering genom sina filnamn, \textit{utan} att man behöver ange absoluta sökvägar. -Du kan i Linux se vad som ligger i din PATH med kommandot \code{ echo $PATH } medan man i Windows Powershell skriver \code{$env.Path} där det bara är första bokstaven som ska vara en versal. I Linux separeras katalogerna i sökvägen med kolon, medan Windows använder semikolon. +Du kan i Linux se vad som ligger i din PATH med kommandot \code{ echo $PATH } medan man i Windows Powershell skriver \code{$env:Path} där det bara är första bokstaven som ska vara en versal. I Linux separeras katalogerna i sökvägen med kolon, medan Windows använder semikolon. Ibland kan du behöva uppdatera din PATH för att program som du installerat och ska bli allmänt tillgängliga. Detta görs på lite olika sätt i olika operativsystem, för Linux se t.ex. här: \href{http://stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux}{stackoverflow.com/questions/14637979/how-to-permanently-set-path-on-linux} diff --git a/compendium/postchapters/vbox.tex b/compendium/postchapters/vbox.tex index 44e244c8a..51efd5ba6 100644 --- a/compendium/postchapters/vbox.tex +++ b/compendium/postchapters/vbox.tex @@ -30,13 +30,13 @@ \section{Vad innehåller kursens vm?} \item \texttt{sbt} version \SbtVersion \end{itemize} -Du kan själv installera fler applikationer i maskinen. Fråga någon som vet hur man installerar saker i Ubuntu eller sök på nätet. +Du kan själv uppdatera dessa applikationer till dess senaste versioner, och även installera fler applikationer, när du väl startat den virtuella maskinen. Se vidare kursens hemsida under ''Verktyg''. \section{Installera kursens vm} -Det går lite långsammare att köra i en virtuell maskin jämfört med att köra direkt ''på metallen'', då det sker vissa översättningar och kontroller under virtualiseringsprocessen som annars är onödiga. Och den virtuella maskinen behöver få en rejäl andel av din dators minne. Så för att köra en virtuell maskin utan att det ska bli segt behövs en ganska snabb processor, gärna över 2 GHz, och ganska mycket minne, gärna mer än 4~GB. +Det går lite långsammare att köra i en virtuell maskin jämfört med att köra direkt ''på metallen'', då det sker vissa översättningar och kontroller under virtualiseringsprocessen som annars inte behövs. Den virtuella maskinen behöver dessutom få en rejäl andel av din dators minne. Så för att köra en virtuell maskin utan att det ska bli segt behövs en ganska snabb processor, gärna över 2 GHz, och ganska mycket minne, gärna minst 8~GB. -Även om det går lite segt är en virtuell maskin ett utmärkt sätt att prova på Linux och Ubuntu. Eftersom man lätt kan spara undan en hel maskin är det ett bra sätt att experimentera med olika inställningar och installationer utan att ens normala miljö påverkas. Du kan lätt klona maskinen för att spara undan den i ett visst läge. Och kör du terminalfönster och en enkel editor brukar svag prestanda och lite minne inte vara ett stort problem. Om du tycker det går alltför segt kan du istället installera Linux direkt på din dator jämsides ditt andra operativsystem -- fråga någon som vet om hur man gör detta. +Även om det går lite segt är en virtuell maskin ett utmärkt sätt att prova på Linux och Ubuntu. Eftersom man lätt kan spara undan en hel maskin är det ett bra sätt att experimentera med olika inställningar och installationer utan att din normala miljö påverkas. Du kan lätt klona maskinen för att spara undan den i ett visst läge. Och kör du terminalfönster och en enkel editor brukar svag prestanda och lite minne inte vara ett stort problem. Om du tycker det går alltför segt kan du istället installera Linux direkt på din dator jämsides ditt andra operativsystem -- fråga någon som vet om hur man gör detta. Gör så här för att installera VirtualBox och köra kursens virtuella maskin: \begin{enumerate} diff --git a/compendium/prechapters/course-instructions.tex b/compendium/prechapters/course-instructions.tex index 3b9acc718..194b8846b 100644 --- a/compendium/prechapters/course-instructions.tex +++ b/compendium/prechapters/course-instructions.tex @@ -142,9 +142,18 @@ \section{Laborationer}\label{section:labs} \begin{enumerate} -\item \textbf{Obligatorium}. Laborationerna är obligatoriska och en viktig del av kursens examination. Godkända laborationer visar att du kan tillämpa den teori som ingår i kursen och att du har tillgodogjort dig en grundläggande förmåga att självständigt, och i grupp, utveckla större program med många delar. \emph{Observera att samtliga laborationer måste vara godkända innan du får tentera!} +\item \textbf{Obligatorium}. Laborationerna är obligatoriska och en viktig del av kursens examination. Godkända laborationer visar att du kan tillämpa den teori som ingår i kursen och att du har tillgodogjort dig en grundläggande förmåga att självständigt, och i grupp, utveckla större program med många delar. \emph{Observera att samtliga laborationer måste vara godkända innan du får göra det muntliga provet och den valfria tentan!} -\item \textbf{Individuellt arbete.} Du ska lösa de individuella laborationerna \emph{självständigt} genom eget, enskilt arbete. Det är tillåtet att under förberedelserna diskutera övergripande principer för laborationernas lösningar i samarbetsgruppen, men var och en måste skapa sin egen lösning. (Speciella anvisningar för grupplaborationer finns i avsnitt \ref{subsection:grouplabs}.) \emph{Du ska absolut \textbf{inte} lägga ut laborationslösningar på nätet}. Läs noga på denna webbsida om var gränsen går mellan samarbete och fusk: \url{http://cs.lth.se/utbildning/samarbete-eller-fusk/} +\item \textbf{Individuellt arbete och fusk.} Du ska lösa de individuella laborationerna \emph{självständigt} genom eget, enskilt arbete. Du får hjälpa andra med att förstå men inte ge eller ta emot färdiga lösningar. Läs \emph{noga} nedan om vad som är tillåtet och inte. Fusk kan medföra avstängning från universitetet och indraget studiemedel. Urkundsförfalskning kan medföra åtal i domstol. +\begin{enumerate} + \item Det är tillåtet att under förberedelserna diskutera övergripande principer för laborationernas lösningar med andra, men var och en ska självständigt skapa en egen lösning. + \item Under redovisningen ska du för handledare på begäran ingående förklara din individuella lösning och de begrepp som ingår i lärandemålen. + \item Speciella anvisningar för grupplaborationer finns i avsnitt \ref{subsection:grouplabs}. + \item Det är \emph{inte} tillåtet att lägga ut lösningar på nätet; det är medhjälp till fusk. + \item Det är \emph{inte} tillåtet att använda artificiell intelligens för att generera lösningar. Det är viktigt att du i denna kurs lär dig att självständigt utveckla grundläggande lösningar så att du i framtiden ska kunna granska och värdera kvaliteten på AI-genererad kod. + \item Läs noga på denna webbsida om var gränsen går mellan samarbete och fusk: \url{http://cs.lth.se/utbildning/samarbete-eller-fusk/} + \item Fusk är inte bara riskabelt och oetiskt, det undergräver dessutom dina fortsatta studier. Begreppen som du lär dig i denna kurs är en grundförutsättning för att du ska ha glädje av efterföljande kurser och ett djupinriktat lärande i denna kurs är grundläggande för hela din utbildning. +\end{enumerate} \item \textbf{Förberedelser}. Till varje laboration finns förberedelser som du ska göra \emph{före} laborationen. Detta är helt avgörande för att du ska hinna göra laborationen inom $2$ timmar. Ta hjälp av en kamrat eller en handledare under resurstiderna om det dyker upp några frågor under ditt förberedelsearbete. Innan varje laboration skall du ha: @@ -187,9 +196,11 @@ \section{Projektuppgift}\label{section:lab:Projekt} \item \textbf{Omfattning}. -Skillnaden mellan projektuppgiften och labbarna är att den ska vara \emph{väsentligt} mer omfattande än de största laborationerna och att du färdigställer den kompletta lösningen \emph{innan} redovisningstillfället. Du behöver därför börja i god tid, förslagsvis två veckor innan redovisningstillfället, för att säkert hinna klart. Det är viktigt att du tänker igenom omfattningen noga, i förhållande till ditt val av projektuppgift, gärna utifrån din självinsikt om vad du behöver träna på. Det är också bra (men inte obligatoriskt) om du blandar Scala och Java i din projektuppgift. Diskutera gärna med en handledare hur du använder projektuppgiften på bästa sätt för ditt lärande. +Skillnaden mellan projektuppgiften och labbarna är att den ska vara \emph{väsentligt} mer omfattande än de största laborationerna och att du färdigställer den kompletta lösningen \emph{innan} redovisningstillfället. Du behöver därför börja i god tid, förslagsvis två veckor innan redovisningstillfället, för att säkert hinna klart. Det är viktigt att du tänker igenom omfattningen noga, i förhållande till ditt val av projektuppgift, gärna utifrån din självinsikt om vad du behöver träna på. Diskutera gärna med en handledare hur du använder projektuppgiften på bästa sätt för ditt lärande. + +\item \textbf{Dokumentation}. Inför redovisningen ska du skapa automatiskt genererad dokumentation utifrån relevanta dokumentationskommentarer för minst hälften av dina publika metoder, enligt instruktioner i Appendix \ref{appendix:doc}. -\item \textbf{Dokumentation}. Inför redovisningen ska du färdigställa automatiskt genererad dokumentation utifrån relevanta dokumentationskommentarer, så som beskrivs i appendix \ref{appendix:doc}. +\item \textbf{Kodlagring och versionshantering.} Projektuppgiften kan vara ett lämpligt tillfälle att träna på versionshantering med git. Det är, precis som för laborationer, \emph{inte} tillåtet att lagra dina lösningar öppet på nätet. Om du vill träna på att använda en kodlagringsplats, t.ex. GitHub eller GitLab, var då noga med att kontrollera att repositoriet är stängt \Eng{closed repository}, så att du inte riskerar medhjälp till fusk. Användning av git och kodlagringsplats är valfritt. \item \textbf{Redovisning}. Vid redovisningen använder du tiden med handledaren till att gå igenom din lösning och redogöra för hur din kod fungerar och diskutera för- och nackdelar med ditt angreppssätt. Du ska också beskriva framväxten av ditt program och hur du stegvis har avlusat och förbättrat implementationen. På redovisningen ska du även gå igenom dokumentationen av din kod. @@ -202,7 +213,7 @@ \section{Muntligt prov} \section{Valfri tentamen} -Kursen avslutas med en \emph{valfri skriftlig tentamen} med snabbreferensen\footnote{\url{http://cs.lth.se/pgk/quickref}} som enda tillåtna hjälpmedel. Tentamensuppgifterna är uppdelade i två delar, del A och del B, med följande preliminära betygsgränser: +Kursen avslutas med en \emph{valfri skriftlig tentamen} med snabbreferensen\footnote{\url{http://cs.lth.se/pgk/quickref}} som enda tillåtna hjälpmedel. Du måste vara godkänd på obligatoriska moment för att få tentera. Tentamensuppgifterna är uppdelade i två delar, del A och del B, med följande preliminära betygsgränser: \begin{itemize} diff --git a/compendium/prechapters/oral-test.tex b/compendium/prechapters/oral-test.tex index c20621c1d..e2fc816e7 100644 --- a/compendium/prechapters/oral-test.tex +++ b/compendium/prechapters/oral-test.tex @@ -1,5 +1,5 @@ -På schemalagd tid senast sista läsveckan i december ska du avlägga ett obligatoriskt muntligt prov för handledare. Syftet med provet är att kontrollera att du har godkänd förståelse för de begrepp som ingår i kursen. Du rekommenderas att förbereda dig noga inför provet, t.ex. genom att gå igenom grundläggande begrepp för varje kursmodul och repetera grundövningar och laborationer. +På schemalagd tid senast sista läsveckan i december ska du avlägga ett obligatoriskt muntligt prov för handledare. Du måste vara godkänt på alla laborationer för att få göra det muntliga provet. Syftet med provet är att kontrollera att du har godkänd förståelse för de begrepp som ingår i kursen. Du rekommenderas att förbereda dig noga inför provet, t.ex. genom att gå igenom grundläggande begrepp för varje kursmodul och repetera grundövningar och laborationer. -Provet sker som ett stickprov ur kursens innehåll. Du kommer att få några slumpvis valda frågor där du ombeds förklara några av de begrepp som ingår i kursen. Du får även uppdrag att skriva kod som liknar kursens övningar och förklara hur koden fungerar. +Provet sker som ett stickprov ur kursens innehåll. Du kommer att få några slumpvis valda frågor där du ombeds förklara några av de begrepp som ingår i kursen. Du får även uppdrag att skriva kod som liknar kursens övningar och förklara hur koden fungerar. Du kan träna på typiska frågor här: \url{https://cs.lth.se/pgk/muntabot/} Om det visar sig oklart huruvida du uppnått godkänd förståelse kan du behöva komplettera ditt muntliga prov. Kontakta kursansvarig för information om omprov. diff --git a/compendium/prechapters/progress-forms.tex b/compendium/prechapters/progress-forms.tex index c0ead9172..106d03eb8 100644 --- a/compendium/prechapters/progress-forms.tex +++ b/compendium/prechapters/progress-forms.tex @@ -9,20 +9,27 @@ \section*{Genomförda övningar} \vspace{1em}\noindent {Till varje laboration hör en övning med uppgifter som utgör förberedelse inför labben. Du behöver minst behärska grunduppgifterna för att klara labben inom rimlig tid. Om du känner att du behöver öva mer på grunderna, gör då även extrauppgifterna. Om du vill fördjupa dig, gör fördjupningsuppgifterna som är på mer avancerad nivå. Kryssa för nedan vilka övningar du har gjort, så blir det lättare för din handledare att anpassa dialogen till de kunskaper du förvärvat hittills.} +%% COMPATIBILITY PROBLEM In latex --version 2022 \bottomrule \addlinespace \midrule \toprule etc gives error ! Misplaced \noalign. +%% Here they are replaced by \hline and \\[1.2em] etc +%% The commands from the booktab chapter are thus cancelled here; can the booktab package be removed? + \newcommand{\TickBox}{\raisebox{-.50ex}{\Large$\square$}} -\newcommand{\ExeRow}[1]{\hyperref[section:exe:#1]{\texttt{#1}} & \TickBox & \TickBox & \TickBox \\ \addlinespace } +\newcommand{\ExeRow}[1]{\hyperref[section:exe:#1]{\texttt{#1}} & \TickBox & \TickBox & \TickBox \\ } %\addlinespace } \begin{table}[h] %\centering \vspace{2em} \begin{tabular}{lccc} -\toprule \addlinespace +\hline \\ %\toprule +%\addlinespace {\sffamily Övning} & {\sffamily Grund} & {\sffamily Extra} & -{\sffamily Fördjupning}\\ \addlinespace \midrule \\[-0.7em] +{\sffamily Fördjupning} \\[1em] \hline %\addlinespace \midrule \\[-0.7em] +\\ + \input{../compendium/generated/exercises-generated.tex} -\bottomrule +\\\hline%\bottomrule \end{tabular} \end{table} @@ -35,41 +42,48 @@ \section*{Godkända obligatoriska moment} Se till att handledaren noterar nedan när du blivit godkänd på respektive obligatorisk moment. Spara detta blad tills du fått slutbetyg i kursen. -\vspace{2.5em}\noindent Namn: \dotfill\\ +\vspace{2.2em}\noindent Namn: \dotfill\\ \vspace{1em}\noindent Namnteckning: \dotfill\\ -\newcommand{\LabRow}[1]{\\[-1.1em] \hyperref[section:lab:#1]{\texttt{#1}} & \dotfill & \dotfill \\ \addlinespace } +\newcommand{\LabRow}[1]{\\[-1.1em] \hyperref[section:lab:#1]{\texttt{#1}} & \dotfill & \dotfill \\[0.7em]} %\addlinespace } \begin{table}[h] %\centering \vspace{1em} \begin{tabular}{lcc} -\toprule \addlinespace +\hline%\toprule\addlinespace +\\ {\sffamily\bfseries\small Lab} & {\sffamily\small Datum gk} & -{\sffamily\small Handledares signatur + namnförtydligande}\\ \addlinespace +{\sffamily\small Handledares signatur + namnförtydligande}\\ %\addlinespace %\midrule \\[-0.5em] \input{../compendium/generated/labs-generated.tex} %\toprule -\addlinespace +%\addlinespace +\\ %\midrule -\addlinespace\addlinespace +%\addlinespace\addlinespace {\sffamily\small {\bfseries Projektuppgift} (välj en) } & \dotfill & \dotfill \\ -\addlinespace\addlinespace %\midrule +%\addlinespace\addlinespace %\midrule +\\ {\Large$\square$}\texttt{~~~\hyperref[section:proj:bank]{bank}} & -\multicolumn{2}{c}{\textit{Om egendef., ge kort beskrivning här:}} \\ \addlinespace -{\Large$\square$}\texttt{~~~\hyperref[section:proj:tabular]{tabular}} \\ \addlinespace -{\Large$\square$}\texttt{~~~\hyperref[section:proj:music]{music}} \\ \addlinespace -{\Large$\square$}\texttt{~~~\hyperref[section:proj:photo]{photo}} \\ \addlinespace +\multicolumn{2}{c}{\textit{Om egendef., ge kort beskrivning här:}} \\[0.6em] %\addlinespace +%{\Large$\square$}\texttt{~~~\hyperref[section:proj:tabular]{tabular}} \\[0.6em] %\addlinespace +{\Large$\square$}\texttt{~~~\hyperref[section:proj:music]{music}} \\[0.6em] %\addlinespace +{\Large$\square$}\texttt{~~~\hyperref[section:proj:photo]{photo}} \\[0.6em] %\addlinespace {\Large$\square$}\texttt{~~~}\textit{egendefinerad} \\ %\dotfill \\ -\addlinespace\addlinespace +%\addlinespace\addlinespace +\\ %\midrule -\addlinespace +% \addlinespace +\\ {\sffamily\small {\bfseries Muntligt prov}} & & \\ -\addlinespace\addlinespace{} +%\addlinespace\addlinespace{} +\\ {\Large$\square$}\texttt{~~~} godkänd & \dotfill & \dotfill \\ -\addlinespace\addlinespace\bottomrule +%\addlinespace\addlinespace +\\\hline%\bottomrule \end{tabular} \end{table} diff --git a/compendium/project/build.properties b/compendium/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/compendium/project/build.properties +++ b/compendium/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/compendium/team-lab-prep-items.tex b/compendium/team-lab-prep-items.tex index 7ffbb0910..bd99f6c39 100644 --- a/compendium/team-lab-prep-items.tex +++ b/compendium/team-lab-prep-items.tex @@ -8,8 +8,10 @@ Arbetsfördelningen ska vara någorlunda jämnt fördelad mellan gruppmedlemmarna. \item Den som är huvudansvarig för en viss del redovisar den delen. +\item +Ni ska ta fram en gruppgemensam checklista för kodgranskning. Varje gruppmedlem ska granska minst en annan gruppmedlems kod enligt checklistan. \item -Grupplaborations obligatoriska uppgifter görs över \textbf{två veckor} uppdelat på två delredovisningar. Vid första redovisningen ska arbetsupplägget och pågående utveckling redovisas. Vid andra tillfället ska de färdig lösningarna presenteras av respektive huvudansvarig individ. +Grupplaborationen görs över \textbf{två veckor} uppdelat på två delredovisningar. Vid första redovisningen ska arbetsupplägget och pågående utveckling redovisas. Vid andra tillfället ska de färdig lösningarna presenteras av respektive huvudansvarig individ. \item Vid första redovisningen ska du redogöra för handledaren hur ni delat upp koden och vem som är huvudansvarig för vad och vad ditt ansvar omfattar, samt hur ni jobbar praktiskt med att synkronisera er utveckling. \item Grupplaborationen är en \textbf{extra stor uppgift} och grupparbetet behöver ledtid för att ni ska hinna koordinera er sinsemellan. Du behöver därför planera för att arbeta med något i grupplabben i stort sett varje dag under de tillgängliga veckorna, och vara redo att bidra i diskussioner. diff --git a/contributors.tex b/contributors.tex index 4cd1a876a..37055e8fd 100644 --- a/contributors.tex +++ b/contributors.tex @@ -25,6 +25,7 @@ Erik Grampp, Evelyn Beck, Fredrik Danebjer, +Fritjof Bengtsson, Gustav Cedersjö, Henrik Olsson, Hussein Taher, diff --git a/glossary/build.sbt b/glossary/build.sbt index 25e8b6b18..b704544b3 100644 --- a/glossary/build.sbt +++ b/glossary/build.sbt @@ -1 +1 @@ -ThisBuild/scalaVersion := "3.0.1" +ThisBuild/scalaVersion := "3.1.2" diff --git a/glossary/concepts-generated.html b/glossary/concepts-generated.html index bbe512139..582b0a1d1 100644 --- a/glossary/concepts-generated.html +++ b/glossary/concepts-generated.html @@ -63,6 +63,9 @@ exekveringsfel kan inträffa medan programmet kör +export +gör namn synligt utåt som medlem i detta objekt + fabriksmetod hjälpfunktion för indirekt konstruktion @@ -94,7 +97,7 @@ en specifik realisering av en algoritm import -gör namn tillgängligt utan att hela sökvägen behövs +gör namn tillgängligt lokalt utan att hela sökvägen behövs inmixning tillföra egenskaper med with och en trait diff --git a/glossary/concepts-generated.md b/glossary/concepts-generated.md index 004b2218e..ea0d5c934 100644 --- a/glossary/concepts-generated.md +++ b/glossary/concepts-generated.md @@ -19,6 +19,7 @@ | dynamisk bindning | körtidstypen avgör vilken metod som körs | | element | objekt i en datastruktur | | exekveringsfel | kan inträffa medan programmet kör | +| export | gör namn synligt utåt som medlem i detta objekt | | fabriksmetod | hjälpfunktion för indirekt konstruktion | | flyttal | decimaltal med begränsad noggrannhet | | for-sats | bra då antalet repetitioner är bestämt i förväg | @@ -29,7 +30,7 @@ | generisk | har abstrakt typparameter, typen är generell | | getter | indirekt åtkomst av attributvärde | | implementation | en specifik realisering av en algoritm | -| import | gör namn tillgängligt utan att hela sökvägen behövs | +| import | gör namn tillgängligt lokalt utan att hela sökvägen behövs | | inmixning | tillföra egenskaper med with och en trait | | innehållslikhet | instanser anses lika om de har samma tillstånd | | instans | upplaga av ett objekt med eget tillståndsminne | diff --git a/glossary/concepts-generated.tex b/glossary/concepts-generated.tex index 30fcb4d70..cc89c8a57 100644 --- a/glossary/concepts-generated.tex +++ b/glossary/concepts-generated.tex @@ -19,6 +19,7 @@ dynamisk bindning & körtidstypen avgör vilken metod som körs \\ element & objekt i en datastruktur \\ exekveringsfel & kan inträffa medan programmet kör \\ +export & gör namn synligt utåt som medlem i detta objekt \\ fabriksmetod & hjälpfunktion för indirekt konstruktion \\ flyttal & decimaltal med begränsad noggrannhet \\ for-sats & bra då antalet repetitioner är bestämt i förväg \\ @@ -29,7 +30,7 @@ generisk & har abstrakt typparameter, typen är generell \\ getter & indirekt åtkomst av attributvärde \\ implementation & en specifik realisering av en algoritm \\ -import & gör namn tillgängligt utan att hela sökvägen behövs \\ +import & gör namn tillgängligt lokalt utan att hela sökvägen behövs \\ inmixning & tillföra egenskaper med with och en trait \\ innehållslikhet & instanser anses lika om de har samma tillstånd \\ instans & upplaga av ett objekt med eget tillståndsminne \\ diff --git a/glossary/project/build.properties b/glossary/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/glossary/project/build.properties +++ b/glossary/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/img/compendium-cover-part1-2022.png b/img/compendium-cover-part1-2022.png new file mode 100644 index 000000000..b29fe9157 Binary files /dev/null and b/img/compendium-cover-part1-2022.png differ diff --git a/img/compendium-cover-part2-2022.png b/img/compendium-cover-part2-2022.png new file mode 100644 index 000000000..5ab49add7 Binary files /dev/null and b/img/compendium-cover-part2-2022.png differ diff --git a/img/kojo-trace.png b/img/kojo-trace.png new file mode 100644 index 000000000..3016f4b4d Binary files /dev/null and b/img/kojo-trace.png differ diff --git a/img/pinsbook.png b/img/pinsbook.png index f3e8907c0..87cb4cd5f 100644 Binary files a/img/pinsbook.png and b/img/pinsbook.png differ diff --git a/img/survey-2022.png b/img/survey-2022.png new file mode 100644 index 000000000..4779c03a0 Binary files /dev/null and b/img/survey-2022.png differ diff --git a/img/vscode-debug.png b/img/vscode-debug.png index 7011765e0..dedd29588 100644 Binary files a/img/vscode-debug.png and b/img/vscode-debug.png differ diff --git a/img/vscode-run.png b/img/vscode-run.png new file mode 100644 index 000000000..b76ea6c3c Binary files /dev/null and b/img/vscode-run.png differ diff --git a/img/vscode-trace.png b/img/vscode-trace.png new file mode 100644 index 000000000..d67eb6ba2 Binary files /dev/null and b/img/vscode-trace.png differ diff --git a/lib/workspace.zip b/lib/workspace.zip index 55da868f6..5febf8c95 100644 Binary files a/lib/workspace.zip and b/lib/workspace.zip differ diff --git a/plan/Plan.scala b/plan/Plan.scala index 214acb4d2..93136633f 100644 --- a/plan/Plan.scala +++ b/plan/Plan.scala @@ -27,7 +27,7 @@ trait Plan { | aritmetik, slumptal, logiska uttryck, de Morgans lagar, if, true, false, while, for, """.stripTrim), - Module("Program, kontrollstrukturer", + Module("Program och kontrollstrukturer", id = "programs", exercise = "programs", lab = "", contents = """ | huvudprogram, program-argument, indata, scala.io.StdIn.readLine, | kontrollstruktur, @@ -38,7 +38,7 @@ trait Plan { | algoritmexempel: SWAP, SUM, MIN-MAX, MIN-INDEX, """.stripTrim), - Module("Funktioner, abstraktion", + Module("Funktioner och abstraktion", id = "functions", exercise = "functions", lab = "irritext", contents = """ | abstraktion, funktion, | parameter, argument, returtyp, default-argument, @@ -52,11 +52,11 @@ trait Plan { | scala.util.Random, slumptalsfrö, """.stripTrim), - Module("Objekt, inkapsling", + Module("Objekt och inkapsling", id = "objects", exercise = "objects", lab = "blockmole", contents = """ | modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, | paket, filstruktur, jar, dokumentation, JDK, - | import, selektiv import, namnbyte vid import, + | import, selektiv import, namnbyte vid import, export, | tupel, multipla returvärden, | block, lokal variabel, skuggning, | lokal funktion, @@ -72,7 +72,7 @@ trait Plan { // | enkelt bash-skript för kompilering ???här eller i vecka 2???, // | sbt tilde run ???här eller i vecka2???, - Module("Klasser, datamodellering", + Module("Klasser och datamodellering", id = "classes", exercise = "classes", lab = "", contents = """ | applikationsdomän, datamodell, objektorientering, klass, instans, | Any, isInstanceOf, toString, @@ -84,7 +84,7 @@ trait Plan { | referenslikhet, innehållslikhet, eq, ==, """.stripTrim), - Module("Mönster, felhantering", + Module("Mönster och felhantering", id = "patterns", exercise = "patterns", lab = "blockbattle", contents = """ | mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, | flatten, flatMap, partiella funktioner, collect, @@ -93,7 +93,7 @@ trait Plan { """.stripTrim), // equals -> sortering??? - Module("Sekvenser, enumerationer", + Module("Sekvenser och enumerationer", id = "sequences", exercise = "sequences", lab = "shuffle", contents = """ | översikt av Scalas samlingsbibliotek och samlingsmetoder, | klasshierarkin i scala.collection, Iterable, @@ -113,14 +113,14 @@ trait Plan { Module("KONTROLLSKRIVN.", id = "", exercise = "", lab = "", contents = "".stripTrim), - Module("Matriser, typparametrar", + Module("Nästlade och generiska strukturer", id = "matrices", exercise = "matrices", lab = "life", contents = """ | matris, nästlad samling, nästlad for-sats, | typparameter, generisk funktion, generisk klass, fri och bunden typparameter, | generiska datastrukturer, generiska samlingar i Scala, """.stripTrim), - Module("Mängder, tabeller", + Module("Mängder och tabeller", id = "setmap", exercise = "lookup", lab = "words", contents = """ | innehållstest, mängd, Set, mutable.Set, | nyckel-värde-tabell, Map, mutable.Map, @@ -128,7 +128,7 @@ trait Plan { | persistens, serialisering, textfiler, Source.fromFile, java.nio.file, """.stripTrim), - Module("Arv, komposition", + Module("Arv och komposition", id = "inheritance", exercise = "inheritance", lab = "snake0", contents = """ | arv, komposition, polymorfism, trait, extends, asInstanceOf, with, inmixning | supertyp, subtyp, bastyp, override, @@ -138,9 +138,10 @@ trait Plan { | trait, abstrakt klass, """.stripTrim), - Module("Kontextparametrar, api", + Module("Kontextuella abstraktioner och varians", id = "context", exercise = "context", lab = "snake1", contents = """ - | given, using, extension, ad hoc polymorfism, typklass, + | över- och undre typgräns, varians, kontravarians, kovarians, typjoker, egentyp, + | givet värde (given), kontextparameter (using), generiska extensionsmetoder, ad hoc polymorfism, kontextgräns, typklass, | api, kodläsbarhet, granskningar """.stripTrim), @@ -150,9 +151,10 @@ trait Plan { """.stripTrim), //http://techie-notebook.blogspot.se/2014/07/difference-between-sorted-sortwith-and.html - Module("Repetition", id = "examprep", exercise = "examprep", lab = "project1", contents = "träna på extentor, redovisa projekt"), + Module("Repetition", id = "examprep", exercise = "examprep", lab = "project1", + contents = "träna på extentor, redovisa projekt, träna inför muntligt prov"), - Module("Muntligt prov", + Module("MUNTLIGT PROV", id = "munta", exercise = "Munta", lab = "Munta", contents = """ """.stripTrim), @@ -196,13 +198,13 @@ trait Plan { else labNumOfWeek(w) } - lazy val startLp1 = Date(2021, 8, 30) + lazy val startLp1 = Date(2022, 8, 29) - lazy val startLp2 = Date(2021, 11, 1) + lazy val startLp2 = Date(2022, 10, 31) - lazy val ksdatum = Date(2021, 10, 27) + lazy val ksdatum = Date(2022, 10, 26) - lazy val tentadatum = Date(2022, 1, 8) + lazy val tentadatum = Date(2023, 1, 7) def weeksOf(date: Date, n: Int): Seq[String] = for (week <- 0 until n) yield date.addDays(week*7).workWeek diff --git a/plan/build.sbt b/plan/build.sbt index 25e8b6b18..b704544b3 100644 --- a/plan/build.sbt +++ b/plan/build.sbt @@ -1 +1 @@ -ThisBuild/scalaVersion := "3.0.1" +ThisBuild/scalaVersion := "3.1.2" diff --git a/plan/courseplan/courseplan.tex b/plan/courseplan/courseplan.tex index d07b5df42..2bdcb9722 100644 --- a/plan/courseplan/courseplan.tex +++ b/plan/courseplan/courseplan.tex @@ -1,5 +1,5 @@ \documentclass[a4paper,12pt,oneside]{memoir} -\usepackage[a4paper, total={16.2cm, 25.0cm}]{geometry} +\usepackage[a4paper, total={16.2cm, 26.0cm}]{geometry} \usepackage[utf8]{inputenc} \usepackage{graphicx} \usepackage[T1]{fontenc} @@ -7,6 +7,7 @@ \usepackage{microtype} \usepackage{hyperref} +\hypersetup{hidelinks} \usepackage{longtable} \usepackage{booktabs} @@ -20,32 +21,44 @@ \usepackage{url} \usepackage{color} -\newcommand{\TBD}{\colorbox{yellow}{\textbf{???}}} -\newcommand{\TENTADATUM}{\colorbox{yellow}{8:e Januari, kl 08:00--13:00, se schema}} -\newcommand{\KSDATUM}{\colorbox{yellow}{Tisdagen 24:e Oktober, kl 14:00--19:00, se schema}} -\newcommand{\YEAR}{2021} +%\newcommand{\TBD}{\colorbox{yellow}{\textbf{???}}} +%\newcommand{\TENTADATUM}{\colorbox{yellow}{8:e Januari, kl 08:00--13:00, se schema}} +%\newcommand{\KSDATUM}{\colorbox{yellow}{Tisdagen 24:e Oktober, kl 14:00--19:00, se schema}} +\newcommand{\YEAR}{2022} \begin{document} +%% COMPATIBILITY PROBLEM In latex --version 2022 \bottomrule \addlinespace \midrule \toprule etc gives error ! Misplaced \noalign. +%% Here they are replaced by \hline and \\[1.2em] etc +%% The commands from the booktab chapter are thus cancelled here; can the booktab package be removed? + + \section*{EDAA45 Programmering, grundkurs -- Kursprogram \YEAR} -\emph{Institutionen för Datavetenskap, LTH, Lunds Universitet.}\\ +\emph{Institutionen för Datavetenskap, LTH, Lunds Universitet.} Senast uppdaterad: \today\\ \begin{longtable}[l]{ll} -\toprule -\textbf{EDAA45} & \textit {D1, W3, 7,5 högskolepoäng, Läsperiod 1 \& 2} \tabularnewline -\midrule +\hline\\[-0.75em]%\toprule + +\textbf{EDAA45} & \textit {D1, C1, W3, 7,5 högskolepoäng, Läsperiod 1 \& 2} \\[-0.75em] \tabularnewline +\hline%\midrule \endhead \emph{Kursansvarig} & Björn Regnell, rum E:2413, \href{mailto:bjorn.regnell@cs.lth.se} {\nolinkurl{bjorn.regnell@cs.lth.se}}, 046--222 90 09\tabularnewline -\emph{Hemsida} & \url{http://cs.lth.se/pgk}\tabularnewline +\emph{Bitr. kursansv.} & Marcus Klang, rum E:4133C, + \href{mailto:marcus.klang@cs.lth.se} + {\nolinkurl{marcus.klang@cs.lth.se}}, + 046--222 38 63\tabularnewline + \emph{Hemsida} + & \url{http://cs.lth.se/pgk}\tabularnewline \emph{Kurslitteratur} & Kompendium. Säljes på institutionens expedition efter förbeställning.\tabularnewline -\emph{Expedition} & \url{http://cs.lth.se/kontakt/expedition/} +\emph{Expedition} & \url{http://cs.lth.se/kontakt/expedition/} Rum E:2179 \tabularnewline - & Rum E:2179, expeditionstid Mån-Tor kl. 9.30--11.30, 12.45--13.30\tabularnewline + %& Rum E:2179, expeditionstid Mån-Tor kl. 9.30--11.30, 12.45--13.30\tabularnewline -\bottomrule +%\bottomrule +\hline \end{longtable} \subsection{Undervisning}\label{undervisning} @@ -65,16 +78,16 @@ \subsection{Undervisning}\label{undervisning} självständigt eller tillsammans med en kamrat. Du kan få hjälp med övningarna av handledare under resurstiderna. Övningarna är förberedelser inför laborationerna och den skriftliga tentamen. - Se anvisningar i kompendiet. + %Se anvisningar i kompendiet. \item \emph{Laborationer}. I kursen ingår obligatoriska laborationer. Laborationerna redovisas för handledare. - Se anvisningar i kompendiet. + %Se anvisningar i kompendiet. \item \emph{Projektuppgift}. Du ska självständigt arbeta med ett större - program och redovisa detta för en handledare. Se anvisningar i - kompendiet. + program som redovisas för handledare. %Se anvisningar i kompendiet. \end{itemize} +Se vidare anvisningar om olika undervisningsmoment i kompendiet och på kurshemsidan. \subsection{Samarbetsgrupper}\label{samarbetsgrupper} @@ -94,24 +107,24 @@ \subsection{Examination}\label{examination} \begin{itemize} \item - \emph{Laborationer} godkänns av handledare på schemalagd tid. + \emph{Laborationer} bedöms av handledare på schemalagd tid. \item \emph{Kontrollskrivningen} är diagnostisk och visar ditt kunskapsläge efter - halva kursen. Kontrollskrivningen görs individuellt och rättas - därefter av studiekamrater vid skrivningstillfället. + halva kursen. Kontrollskrivningen görs individuellt och bedöms + av studiekamrater vid skrivningstillfället. Kontrollskrivningen kan ge \emph{samarbetsbonus} som adderas till det skriftliga tentamensresultatet vid första ordinarie tentatillfälle med medelvärdet av gruppmedlemmarnas individuella - kontrollskrivningspoäng. %Datum: \KSDATUM + kontrollskrivningspoäng. Det räcker att delta för att bli godkänd på kontrollskrivningen.%Datum: \KSDATUM \item - \emph{Projektuppgift} görs individuellt och godkänns av handledare på + \emph{Projektuppgift} görs individuellt och bedöms av handledare på schemalagd tid. \end{itemize} \item - \emph{Muntligt prov och tentamen (3 hp)}. Muntligt prov är obligatoriskt och godkänt muntligt prov krävs för betyg 3. Skriftlig tentamen är valfri och kan ge betyg 4 el. 5. Tillåtet hjälpmedel: + \emph{Muntligt prov och tentamen (3 hp)}. Det muntliga provet är obligatoriskt. Godkänt muntligt prov krävs för betyg 3. Skriftlig tentamen är valfri och kan ge betyg 4 el. 5. Tillåtet hjälpmedel: \href{http://cs.lth.se/pgk/quickref}{Snabbreferens}. - För att få tentera krävs att samtliga laborationer, projekt och muntligt prov är godkända.\\ + För att få tentera krävs att alla obligatoriska moment är godkända.\\ % Ordinarie tentamen: \TENTADATUM \end{itemize} @@ -120,9 +133,22 @@ \subsection{Examination}\label{examination} \subsection*{Veckoöversikt} \resizebox{\columnwidth}{!}{% -{\fontsize{12pt}{24pt}\selectfont +{\fontsize{12pt}{20pt}\selectfont \input{../week-plan-generated.tex} } } +\vspace{1.1em}\noindent\hspace*{-2.0mm}% +\noindent\textit{Preliminärt innehåll per vecka}\\~\\ +\noindent\resizebox{\columnwidth}{!} +{% +{ +\fontsize{5.0pt}{6.0pt}\selectfont +\begin{tabular}{l|l|p{7.4cm}} +\input{../module-plan-generated.tex} +\end{tabular} +} +} + + \end{document} diff --git a/plan/module-plan-generated.html b/plan/module-plan-generated.html index e3b71d890..67655023c 100644 --- a/plan/module-plan-generated.html +++ b/plan/module-plan-generated.html @@ -12,27 +12,27 @@ sekvens, alternativ, repetition, abstraktion, editera, kompilera, exekvera, datorns delar, virtuell maskin, litteral, värde, uttryck, identifierare, variabel, typ, tilldelning, namn, val, var, def, definiera och anropa funktion, funktionshuvud, funktionskropp, procedur, inbyggda grundtyper, println, typen Unit, enhetsvärdet (), stränginterpolatorn s, aritmetik, slumptal, logiska uttryck, de Morgans lagar, if, true, false, while, for W02 -Program, kontrollstrukturer +Program och kontrollstrukturer huvudprogram, program-argument, indata, scala.io.StdIn.readLine, kontrollstruktur, iterera över element i samling, for-uttryck, yield, map, foreach, samling, sekvens, indexering, Array, Vector, intervall, Range, algoritm, implementation, pseudokod, algoritmexempel: SWAP, SUM, MIN-MAX, MIN-INDEX W03 -Funktioner, abstraktion +Funktioner och abstraktion abstraktion, funktion, parameter, argument, returtyp, default-argument, namngivna argument, parameterlista, funktionshuvud, funktionskropp, applicera funktion på alla element i en samling, uppdelad parameterlista, skapa egen kontrollstruktur, funktionsvärde, funktionstyp, äkta funktion, stegad funktion, apply, anonyma funktioner, lambda, predikat, aktiveringspost, anropsstacken, objektheapen, stack trace, rekursion, scala.util.Random, slumptalsfrö W04 -Objekt, inkapsling -modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, paket, filstruktur, jar, dokumentation, JDK, import, selektiv import, namnbyte vid import, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om enhetlig access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias +Objekt och inkapsling +modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, paket, filstruktur, jar, dokumentation, JDK, import, selektiv import, namnbyte vid import, export, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om enhetlig access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias W05 -Klasser, datamodellering +Klasser och datamodellering applikationsdomän, datamodell, objektorientering, klass, instans, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == W06 -Mönster, felhantering +Mönster och felhantering mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode W07 -Sekvenser, enumerationer +Sekvenser och enumerationer översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar KS @@ -40,20 +40,20 @@ W08 -Matriser, typparametrar +Nästlade och generiska strukturer matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri och bunden typparameter, generiska datastrukturer, generiska samlingar i Scala W09 -Mängder, tabeller +Mängder och tabeller innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file W10 -Arv, komposition +Arv och komposition arv, komposition, polymorfism, trait, extends, asInstanceOf, with, inmixning supertyp, subtyp, bastyp, override, Scalas typhierarki, Any, AnyRef, Object, AnyVal, Null, Nothing, topptyp, bottentyp, referenstyper, värdetyper, accessregler vid arv, protected, final, trait, abstrakt klass W11 -Kontextparametrar, api -given, using, extension, ad hoc polymorfism, typklass, api, kodläsbarhet, granskningar +Kontextuella abstraktioner och varians +över- och undre typgräns, varians, kontravarians, kovarians, typjoker, egentyp, givet värde (given), kontextparameter (using), generiska extensionsmetoder, ad hoc polymorfism, kontextgräns, typklass, api, kodläsbarhet, granskningar W12 Valfri fördjupning, Projekt @@ -61,10 +61,10 @@ W13 Repetition -träna på extentor, redovisa projekt +träna på extentor, redovisa projekt, träna inför muntligt prov W14 -Muntligt prov +MUNTLIGT PROV T diff --git a/plan/module-plan-generated.md b/plan/module-plan-generated.md index 7e7030c06..bed1d72b3 100644 --- a/plan/module-plan-generated.md +++ b/plan/module-plan-generated.md @@ -1,18 +1,18 @@ -| W | Modul | Innehåll | -|:----|:----------------------------|:--| -| W01 | Introduktion | sekvens, alternativ, repetition, abstraktion, editera, kompilera, exekvera, datorns delar, virtuell maskin, litteral, värde, uttryck, identifierare, variabel, typ, tilldelning, namn, val, var, def, definiera och anropa funktion, funktionshuvud, funktionskropp, procedur, inbyggda grundtyper, println, typen Unit, enhetsvärdet (), stränginterpolatorn s, aritmetik, slumptal, logiska uttryck, de Morgans lagar, if, true, false, while, for | -| W02 | Program, kontrollstrukturer | huvudprogram, program-argument, indata, scala.io.StdIn.readLine, kontrollstruktur, iterera över element i samling, for-uttryck, yield, map, foreach, samling, sekvens, indexering, Array, Vector, intervall, Range, algoritm, implementation, pseudokod, algoritmexempel: SWAP, SUM, MIN-MAX, MIN-INDEX | -| W03 | Funktioner, abstraktion | abstraktion, funktion, parameter, argument, returtyp, default-argument, namngivna argument, parameterlista, funktionshuvud, funktionskropp, applicera funktion på alla element i en samling, uppdelad parameterlista, skapa egen kontrollstruktur, funktionsvärde, funktionstyp, äkta funktion, stegad funktion, apply, anonyma funktioner, lambda, predikat, aktiveringspost, anropsstacken, objektheapen, stack trace, rekursion, scala.util.Random, slumptalsfrö | -| W04 | Objekt, inkapsling | modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, paket, filstruktur, jar, dokumentation, JDK, import, selektiv import, namnbyte vid import, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om enhetlig access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias | -| W05 | Klasser, datamodellering | applikationsdomän, datamodell, objektorientering, klass, instans, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == | -| W06 | Mönster, felhantering | mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode | -| W07 | Sekvenser, enumerationer | översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar | -| KS | KONTROLLSKRIVN. | | -| W08 | Matriser, typparametrar | matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri och bunden typparameter, generiska datastrukturer, generiska samlingar i Scala | -| W09 | Mängder, tabeller | innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file | -| W10 | Arv, komposition | arv, komposition, polymorfism, trait, extends, asInstanceOf, with, inmixning supertyp, subtyp, bastyp, override, Scalas typhierarki, Any, AnyRef, Object, AnyVal, Null, Nothing, topptyp, bottentyp, referenstyper, värdetyper, accessregler vid arv, protected, final, trait, abstrakt klass | -| W11 | Kontextparametrar, api | given, using, extension, ad hoc polymorfism, typklass, api, kodläsbarhet, granskningar | -| W12 | Valfri fördjupning, Projekt | välj valfritt fördjupningsområde, påbörja projekt | -| W13 | Repetition | träna på extentor, redovisa projekt | -| W14 | Muntligt prov | | -| T | VALFRI TENTAMEN | | \ No newline at end of file +| W | Modul | Innehåll | +|:----|:---------------------------------------|:--| +| W01 | Introduktion | sekvens, alternativ, repetition, abstraktion, editera, kompilera, exekvera, datorns delar, virtuell maskin, litteral, värde, uttryck, identifierare, variabel, typ, tilldelning, namn, val, var, def, definiera och anropa funktion, funktionshuvud, funktionskropp, procedur, inbyggda grundtyper, println, typen Unit, enhetsvärdet (), stränginterpolatorn s, aritmetik, slumptal, logiska uttryck, de Morgans lagar, if, true, false, while, for | +| W02 | Program och kontrollstrukturer | huvudprogram, program-argument, indata, scala.io.StdIn.readLine, kontrollstruktur, iterera över element i samling, for-uttryck, yield, map, foreach, samling, sekvens, indexering, Array, Vector, intervall, Range, algoritm, implementation, pseudokod, algoritmexempel: SWAP, SUM, MIN-MAX, MIN-INDEX | +| W03 | Funktioner och abstraktion | abstraktion, funktion, parameter, argument, returtyp, default-argument, namngivna argument, parameterlista, funktionshuvud, funktionskropp, applicera funktion på alla element i en samling, uppdelad parameterlista, skapa egen kontrollstruktur, funktionsvärde, funktionstyp, äkta funktion, stegad funktion, apply, anonyma funktioner, lambda, predikat, aktiveringspost, anropsstacken, objektheapen, stack trace, rekursion, scala.util.Random, slumptalsfrö | +| W04 | Objekt och inkapsling | modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, paket, filstruktur, jar, dokumentation, JDK, import, selektiv import, namnbyte vid import, export, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om enhetlig access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias | +| W05 | Klasser och datamodellering | applikationsdomän, datamodell, objektorientering, klass, instans, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == | +| W06 | Mönster och felhantering | mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode | +| W07 | Sekvenser och enumerationer | översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar | +| KS | KONTROLLSKRIVN. | | +| W08 | Nästlade och generiska strukturer | matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri och bunden typparameter, generiska datastrukturer, generiska samlingar i Scala | +| W09 | Mängder och tabeller | innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file | +| W10 | Arv och komposition | arv, komposition, polymorfism, trait, extends, asInstanceOf, with, inmixning supertyp, subtyp, bastyp, override, Scalas typhierarki, Any, AnyRef, Object, AnyVal, Null, Nothing, topptyp, bottentyp, referenstyper, värdetyper, accessregler vid arv, protected, final, trait, abstrakt klass | +| W11 | Kontextuella abstraktioner och varians | över- och undre typgräns, varians, kontravarians, kovarians, typjoker, egentyp, givet värde (given), kontextparameter (using), generiska extensionsmetoder, ad hoc polymorfism, kontextgräns, typklass, api, kodläsbarhet, granskningar | +| W12 | Valfri fördjupning, Projekt | välj valfritt fördjupningsområde, påbörja projekt | +| W13 | Repetition | träna på extentor, redovisa projekt, träna inför muntligt prov | +| W14 | MUNTLIGT PROV | | +| T | VALFRI TENTAMEN | | \ No newline at end of file diff --git a/plan/module-plan-generated.tex b/plan/module-plan-generated.tex index 97c119d17..b6b011ea7 100644 --- a/plan/module-plan-generated.tex +++ b/plan/module-plan-generated.tex @@ -1,16 +1,16 @@ W01 & Introduktion & sekvens, alternativ, repetition, abstraktion, editera, kompilera, exekvera, datorns delar, virtuell maskin, litteral, värde, uttryck, identifierare, variabel, typ, tilldelning, namn, val, var, def, definiera och anropa funktion, funktionshuvud, funktionskropp, procedur, inbyggda grundtyper, println, typen Unit, enhetsvärdet (), stränginterpolatorn s, aritmetik, slumptal, logiska uttryck, de Morgans lagar, if, true, false, while, for \\ -W02 & Program, kontrollstrukturer & huvudprogram, program-argument, indata, scala.io.StdIn.readLine, kontrollstruktur, iterera över element i samling, for-uttryck, yield, map, foreach, samling, sekvens, indexering, Array, Vector, intervall, Range, algoritm, implementation, pseudokod, algoritmexempel: SWAP, SUM, MIN-MAX, MIN-INDEX \\ -W03 & Funktioner, abstraktion & abstraktion, funktion, parameter, argument, returtyp, default-argument, namngivna argument, parameterlista, funktionshuvud, funktionskropp, applicera funktion på alla element i en samling, uppdelad parameterlista, skapa egen kontrollstruktur, funktionsvärde, funktionstyp, äkta funktion, stegad funktion, apply, anonyma funktioner, lambda, predikat, aktiveringspost, anropsstacken, objektheapen, stack trace, rekursion, scala.util.Random, slumptalsfrö \\ -W04 & Objekt, inkapsling & modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, paket, filstruktur, jar, dokumentation, JDK, import, selektiv import, namnbyte vid import, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om enhetlig access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias \\ -W05 & Klasser, datamodellering & applikationsdomän, datamodell, objektorientering, klass, instans, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == \\ -W06 & Mönster, felhantering & mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode \\ -W07 & Sekvenser, enumerationer & översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar \\ +W02 & Program och kontrollstrukturer & huvudprogram, program-argument, indata, scala.io.StdIn.readLine, kontrollstruktur, iterera över element i samling, for-uttryck, yield, map, foreach, samling, sekvens, indexering, Array, Vector, intervall, Range, algoritm, implementation, pseudokod, algoritmexempel: SWAP, SUM, MIN-MAX, MIN-INDEX \\ +W03 & Funktioner och abstraktion & abstraktion, funktion, parameter, argument, returtyp, default-argument, namngivna argument, parameterlista, funktionshuvud, funktionskropp, applicera funktion på alla element i en samling, uppdelad parameterlista, skapa egen kontrollstruktur, funktionsvärde, funktionstyp, äkta funktion, stegad funktion, apply, anonyma funktioner, lambda, predikat, aktiveringspost, anropsstacken, objektheapen, stack trace, rekursion, scala.util.Random, slumptalsfrö \\ +W04 & Objekt och inkapsling & modul, singelobjekt, punktnotation, tillstånd, medlem, attribut, metod, paket, filstruktur, jar, dokumentation, JDK, import, selektiv import, namnbyte vid import, export, tupel, multipla returvärden, block, lokal variabel, skuggning, lokal funktion, funktioner är objekt med apply-metod, namnrymd, synlighet, privat medlem, inkapsling, getter och setter, principen om enhetlig access, överlagring av metoder, introprog.PixelWindow, initialisering, lazy val, värdeandrop, namnanrop, typalias \\ +W05 & Klasser och datamodellering & applikationsdomän, datamodell, objektorientering, klass, instans, Any, isInstanceOf, toString, new, null, this, accessregler, private, private[this], klassparameter, primär konstruktor, fabriksmetod, alternativ konstruktor, förändringsbar, oföränderlig, case-klass, kompanjonsobjekt, referenslikhet, innehållslikhet, eq, == \\ +W06 & Mönster och felhantering & mönstermatchning, match, Option, throw, try, catch, Try, unapply, sealed, flatten, flatMap, partiella funktioner, collect, wildcard-mönster, variabelbindning i mönster, sekvens-wildcard, bokstavliga mönster, implementera equals, hashcode \\ +W07 & Sekvenser och enumerationer & översikt av Scalas samlingsbibliotek och samlingsmetoder, klasshierarkin i scala.collection, Iterable, Seq, List, ListBuffer, ArrayBuffer, WrappedArray, sekvensalgoritm, algoritm: SEQ-COPY, in-place vs copy, algoritm: SEQ-REVERSE, registrering, algoritm: SEQ-REGISTER, linjärsökning, algoritm: LINEAR-SEARCH, tidskomplexitet, minneskomplexitet, sekvenser i Java vs Scala, for-sats i Java, java.util.Scanner, översikt strängmetoder, StringBuilder, ordning, inbyggda sökmetoder, find, indexOf, indexWhere, inbyggda sorteringsmetoder, sorted, sortWith, sortBy, repeterade parametrar \\ KS & \multicolumn{2}{l}{KONTROLLSKRIVN.} \\ -W08 & Matriser, typparametrar & matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri och bunden typparameter, generiska datastrukturer, generiska samlingar i Scala \\ -W09 & Mängder, tabeller & innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file \\ -W10 & Arv, komposition & arv, komposition, polymorfism, trait, extends, asInstanceOf, with, inmixning supertyp, subtyp, bastyp, override, Scalas typhierarki, Any, AnyRef, Object, AnyVal, Null, Nothing, topptyp, bottentyp, referenstyper, värdetyper, accessregler vid arv, protected, final, trait, abstrakt klass \\ -W11 & Kontextparametrar, api & given, using, extension, ad hoc polymorfism, typklass, api, kodläsbarhet, granskningar \\ +W08 & Nästlade och generiska strukturer & matris, nästlad samling, nästlad for-sats, typparameter, generisk funktion, generisk klass, fri och bunden typparameter, generiska datastrukturer, generiska samlingar i Scala \\ +W09 & Mängder och tabeller & innehållstest, mängd, Set, mutable.Set, nyckel-värde-tabell, Map, mutable.Map, hash code, java.util.HashMap, java.util.HashSet, persistens, serialisering, textfiler, Source.fromFile, java.nio.file \\ +W10 & Arv och komposition & arv, komposition, polymorfism, trait, extends, asInstanceOf, with, inmixning supertyp, subtyp, bastyp, override, Scalas typhierarki, Any, AnyRef, Object, AnyVal, Null, Nothing, topptyp, bottentyp, referenstyper, värdetyper, accessregler vid arv, protected, final, trait, abstrakt klass \\ +W11 & Kontextuella abstraktioner och varians & över- och undre typgräns, varians, kontravarians, kovarians, typjoker, egentyp, givet värde (given), kontextparameter (using), generiska extensionsmetoder, ad hoc polymorfism, kontextgräns, typklass, api, kodläsbarhet, granskningar \\ W12 & Valfri fördjupning, Projekt & välj valfritt fördjupningsområde, påbörja projekt \\ -W13 & Repetition & träna på extentor, redovisa projekt \\ -W14 & \multicolumn{2}{l}{Muntligt prov} \\ +W13 & Repetition & träna på extentor, redovisa projekt, träna inför muntligt prov \\ +W14 & \multicolumn{2}{l}{MUNTLIGT PROV} \\ T & \multicolumn{2}{l}{VALFRI TENTAMEN} \\ \ No newline at end of file diff --git a/plan/overview-generated.tex b/plan/overview-generated.tex index 92e006923..15f462563 100644 --- a/plan/overview-generated.tex +++ b/plan/overview-generated.tex @@ -2,19 +2,19 @@ \begin{tabular}{l|l|l|l} \textit{W} & \textit{Modul} & \textit{Övn} & \textit{Lab} \\ \hline \hline W01 & Introduktion & expressions & kojo \\ -W02 & Program, kontrollstrukturer & programs & -- \\ -W03 & Funktioner, abstraktion & functions & irritext \\ -W04 & Objekt, inkapsling & objects & blockmole \\ -W05 & Klasser, datamodellering & classes & -- \\ -W06 & Mönster, felhantering & patterns & blockbattle \\ -W07 & Sekvenser, enumerationer & sequences & shuffle \\ +W02 & Program och kontrollstrukturer & programs & -- \\ +W03 & Funktioner och abstraktion & functions & irritext \\ +W04 & Objekt och inkapsling & objects & blockmole \\ +W05 & Klasser och datamodellering & classes & -- \\ +W06 & Mönster och felhantering & patterns & blockbattle \\ +W07 & Sekvenser och enumerationer & sequences & shuffle \\ KS & KONTROLLSKRIVN. & -- & -- \\ -W08 & Matriser, typparametrar & matrices & life \\ -W09 & Mängder, tabeller & lookup & words \\ -W10 & Arv, komposition & inheritance & snake0 \\ -W11 & Kontextparametrar, api & context & snake1 \\ +W08 & Nästlade och generiska strukturer & matrices & life \\ +W09 & Mängder och tabeller & lookup & words \\ +W10 & Arv och komposition & inheritance & snake0 \\ +W11 & Kontextuella abstraktioner och varians & context & snake1 \\ W12 & Valfri fördjupning, Projekt & extra & Projekt0 \\ W13 & Repetition & examprep & Projekt1 \\ -W14 & Muntligt prov & Munta & Munta \\ +W14 & MUNTLIGT PROV & Munta & Munta \\ T & VALFRI TENTAMEN & -- & -- \\ \end{tabular} diff --git a/plan/project/build.properties b/plan/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/plan/project/build.properties +++ b/plan/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/plan/week-plan-generated.html b/plan/week-plan-generated.html index 3b9a3b5f5..0820f23eb 100644 --- a/plan/week-plan-generated.html +++ b/plan/week-plan-generated.html @@ -12,7 +12,7 @@ W01 -30/8-3/9 +29/8-2/9 Lp1V1 Introduktion F01 F02 @@ -20,55 +20,55 @@ kojo W02 -6/9-10/9 +5/9-9/9 Lp1V2 -Program, kontrollstrukturer +Program och kontrollstrukturer F03 F04 programs -- W03 -13/9-17/9 +12/9-16/9 Lp1V3 -Funktioner, abstraktion +Funktioner och abstraktion F05 F06 functions irritext W04 -20/9-24/9 +19/9-23/9 Lp1V4 -Objekt, inkapsling +Objekt och inkapsling F07 F08 objects blockmole W05 -27/9-1/10 +26/9-30/9 Lp1V5 -Klasser, datamodellering +Klasser och datamodellering F09 F10 classes -- W06 -4/10-8/10 +3/10-7/10 Lp1V6 -Mönster, felhantering +Mönster och felhantering F11 F12 patterns blockbattle W07 -11/10-15/10 +10/10-14/10 Lp1V7 -Sekvenser, enumerationer +Sekvenser och enumerationer F13 F14 sequences shuffle KS -27/10 +26/10 TP1 KONTROLLSKRIVN. -- @@ -76,39 +76,39 @@ -- W08 -1/11-5/11 +31/10-4/11 Lp2V1 -Matriser, typparametrar +Nästlade och generiska strukturer F15 F16 matrices life W09 -8/11-12/11 +7/11-11/11 Lp2V2 -Mängder, tabeller +Mängder och tabeller F17 F18 lookup words W10 -15/11-19/11 +14/11-18/11 Lp2V3 -Arv, komposition +Arv och komposition F19 F20 inheritance snake0 W11 -22/11-26/11 +21/11-25/11 Lp2V4 -Kontextparametrar, api +Kontextuella abstraktioner och varians F21 F22 context snake1 W12 -29/11-3/12 +28/11-2/12 Lp2V5 Valfri fördjupning, Projekt F23 F24 @@ -116,7 +116,7 @@ Projekt0 W13 -6/12-10/12 +5/12-9/12 Lp2V6 Repetition F25 F26 @@ -124,15 +124,15 @@ Projekt1 W14 -13/12-17/12 +12/12-16/12 Lp2V7 -Muntligt prov +MUNTLIGT PROV F27 F28 Munta Munta T -8/1 +7/1 TP2 VALFRI TENTAMEN -- diff --git a/plan/week-plan-generated.md b/plan/week-plan-generated.md index 6218e88b2..2ed3398d7 100644 --- a/plan/week-plan-generated.md +++ b/plan/week-plan-generated.md @@ -1,18 +1,18 @@ -| W | Datum | Lp V | Modul | Förel | Övn | Lab | -|:----|:------------|:------|:----------------------------|:--------|:------------|:------------| -| W01 | 30/8-3/9 | Lp1V1 | Introduktion | F01 F02 | expressions | kojo | -| W02 | 6/9-10/9 | Lp1V2 | Program, kontrollstrukturer | F03 F04 | programs | -- | -| W03 | 13/9-17/9 | Lp1V3 | Funktioner, abstraktion | F05 F06 | functions | irritext | -| W04 | 20/9-24/9 | Lp1V4 | Objekt, inkapsling | F07 F08 | objects | blockmole | -| W05 | 27/9-1/10 | Lp1V5 | Klasser, datamodellering | F09 F10 | classes | -- | -| W06 | 4/10-8/10 | Lp1V6 | Mönster, felhantering | F11 F12 | patterns | blockbattle | -| W07 | 11/10-15/10 | Lp1V7 | Sekvenser, enumerationer | F13 F14 | sequences | shuffle | -| KS | 27/10 | TP1 | KONTROLLSKRIVN. | -- | -- | -- | -| W08 | 1/11-5/11 | Lp2V1 | Matriser, typparametrar | F15 F16 | matrices | life | -| W09 | 8/11-12/11 | Lp2V2 | Mängder, tabeller | F17 F18 | lookup | words | -| W10 | 15/11-19/11 | Lp2V3 | Arv, komposition | F19 F20 | inheritance | snake0 | -| W11 | 22/11-26/11 | Lp2V4 | Kontextparametrar, api | F21 F22 | context | snake1 | -| W12 | 29/11-3/12 | Lp2V5 | Valfri fördjupning, Projekt | F23 F24 | extra | Projekt0 | -| W13 | 6/12-10/12 | Lp2V6 | Repetition | F25 F26 | examprep | Projekt1 | -| W14 | 13/12-17/12 | Lp2V7 | Muntligt prov | F27 F28 | Munta | Munta | -| T | 8/1 | TP2 | VALFRI TENTAMEN | -- | -- | -- | \ No newline at end of file +| W | Datum | Lp V | Modul | Förel | Övn | Lab | +|:----|:------------|:------|:---------------------------------------|:--------|:------------|:------------| +| W01 | 29/8-2/9 | Lp1V1 | Introduktion | F01 F02 | expressions | kojo | +| W02 | 5/9-9/9 | Lp1V2 | Program och kontrollstrukturer | F03 F04 | programs | -- | +| W03 | 12/9-16/9 | Lp1V3 | Funktioner och abstraktion | F05 F06 | functions | irritext | +| W04 | 19/9-23/9 | Lp1V4 | Objekt och inkapsling | F07 F08 | objects | blockmole | +| W05 | 26/9-30/9 | Lp1V5 | Klasser och datamodellering | F09 F10 | classes | -- | +| W06 | 3/10-7/10 | Lp1V6 | Mönster och felhantering | F11 F12 | patterns | blockbattle | +| W07 | 10/10-14/10 | Lp1V7 | Sekvenser och enumerationer | F13 F14 | sequences | shuffle | +| KS | 26/10 | TP1 | KONTROLLSKRIVN. | -- | -- | -- | +| W08 | 31/10-4/11 | Lp2V1 | Nästlade och generiska strukturer | F15 F16 | matrices | life | +| W09 | 7/11-11/11 | Lp2V2 | Mängder och tabeller | F17 F18 | lookup | words | +| W10 | 14/11-18/11 | Lp2V3 | Arv och komposition | F19 F20 | inheritance | snake0 | +| W11 | 21/11-25/11 | Lp2V4 | Kontextuella abstraktioner och varians | F21 F22 | context | snake1 | +| W12 | 28/11-2/12 | Lp2V5 | Valfri fördjupning, Projekt | F23 F24 | extra | Projekt0 | +| W13 | 5/12-9/12 | Lp2V6 | Repetition | F25 F26 | examprep | Projekt1 | +| W14 | 12/12-16/12 | Lp2V7 | MUNTLIGT PROV | F27 F28 | Munta | Munta | +| T | 7/1 | TP2 | VALFRI TENTAMEN | -- | -- | -- | \ No newline at end of file diff --git a/plan/week-plan-generated.tex b/plan/week-plan-generated.tex index 2e36d3206..d777c8621 100644 --- a/plan/week-plan-generated.tex +++ b/plan/week-plan-generated.tex @@ -1,20 +1,20 @@ %!TEX encoding = UTF-8 Unicode \begin{tabular}{l|l|l|l|l|l|l} \textit{W} & \textit{Datum} & \textit{Lp V} & \textit{Modul} & \textit{Förel} & \textit{Övn} & \textit{Lab} \\ \hline \hline -W01 & 30/8-3/9 & Lp1V1 & Introduktion & F01 F02 & expressions & kojo \\ -W02 & 6/9-10/9 & Lp1V2 & Program, kontrollstrukturer & F03 F04 & programs & -- \\ -W03 & 13/9-17/9 & Lp1V3 & Funktioner, abstraktion & F05 F06 & functions & irritext \\ -W04 & 20/9-24/9 & Lp1V4 & Objekt, inkapsling & F07 F08 & objects & blockmole \\ -W05 & 27/9-1/10 & Lp1V5 & Klasser, datamodellering & F09 F10 & classes & -- \\ -W06 & 4/10-8/10 & Lp1V6 & Mönster, felhantering & F11 F12 & patterns & blockbattle \\ -W07 & 11/10-15/10 & Lp1V7 & Sekvenser, enumerationer & F13 F14 & sequences & shuffle \\ -KS & 27/10 & TP1 & KONTROLLSKRIVN. & -- & -- & -- \\ -W08 & 1/11-5/11 & Lp2V1 & Matriser, typparametrar & F15 F16 & matrices & life \\ -W09 & 8/11-12/11 & Lp2V2 & Mängder, tabeller & F17 F18 & lookup & words \\ -W10 & 15/11-19/11 & Lp2V3 & Arv, komposition & F19 F20 & inheritance & snake0 \\ -W11 & 22/11-26/11 & Lp2V4 & Kontextparametrar, api & F21 F22 & context & snake1 \\ -W12 & 29/11-3/12 & Lp2V5 & Valfri fördjupning, Projekt & F23 F24 & extra & Projekt0 \\ -W13 & 6/12-10/12 & Lp2V6 & Repetition & F25 F26 & examprep & Projekt1 \\ -W14 & 13/12-17/12 & Lp2V7 & Muntligt prov & F27 F28 & Munta & Munta \\ -T & 8/1 & TP2 & VALFRI TENTAMEN & -- & -- & -- \\ +W01 & 29/8-2/9 & Lp1V1 & Introduktion & F01 F02 & expressions & kojo \\ +W02 & 5/9-9/9 & Lp1V2 & Program och kontrollstrukturer & F03 F04 & programs & -- \\ +W03 & 12/9-16/9 & Lp1V3 & Funktioner och abstraktion & F05 F06 & functions & irritext \\ +W04 & 19/9-23/9 & Lp1V4 & Objekt och inkapsling & F07 F08 & objects & blockmole \\ +W05 & 26/9-30/9 & Lp1V5 & Klasser och datamodellering & F09 F10 & classes & -- \\ +W06 & 3/10-7/10 & Lp1V6 & Mönster och felhantering & F11 F12 & patterns & blockbattle \\ +W07 & 10/10-14/10 & Lp1V7 & Sekvenser och enumerationer & F13 F14 & sequences & shuffle \\ +KS & 26/10 & TP1 & KONTROLLSKRIVN. & -- & -- & -- \\ +W08 & 31/10-4/11 & Lp2V1 & Nästlade och generiska strukturer & F15 F16 & matrices & life \\ +W09 & 7/11-11/11 & Lp2V2 & Mängder och tabeller & F17 F18 & lookup & words \\ +W10 & 14/11-18/11 & Lp2V3 & Arv och komposition & F19 F20 & inheritance & snake0 \\ +W11 & 21/11-25/11 & Lp2V4 & Kontextuella abstraktioner och varians & F21 F22 & context & snake1 \\ +W12 & 28/11-2/12 & Lp2V5 & Valfri fördjupning, Projekt & F23 F24 & extra & Projekt0 \\ +W13 & 5/12-9/12 & Lp2V6 & Repetition & F25 F26 & examprep & Projekt1 \\ +W14 & 12/12-16/12 & Lp2V7 & MUNTLIGT PROV & F27 F28 & Munta & Munta \\ +T & 7/1 & TP2 & VALFRI TENTAMEN & -- & -- & -- \\ \end{tabular} diff --git a/project/build.properties b/project/build.properties index 10fd9eee0..22af2628c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.7.1 diff --git a/quickref/quickref-2.12/quickref.tex b/quickref/quickref-2.12/quickref.tex index dc3e33486..9aa5584d8 100644 --- a/quickref/quickref-2.12/quickref.tex +++ b/quickref/quickref-2.12/quickref.tex @@ -1004,7 +1004,7 @@ \Newline\head{scala.jdk.CollectionConverters}\Newline {\small -Enable \code{.asJava} and \code{.asScala} conversions: \code{ import scala.jdk.CollectionConverters._ } +Enable \code{.asJava} and \code{.asScala} conversions: \code{ import scala.jdk.CollectionConverters.* } \vspace{0.5em} \begin{tabular}{@{}r c l} diff --git a/quickref/quickref-2.13/quickref.tex b/quickref/quickref-2.13/quickref.tex index 6d4609c66..83db4d1e3 100644 --- a/quickref/quickref-2.13/quickref.tex +++ b/quickref/quickref-2.13/quickref.tex @@ -1012,7 +1012,7 @@ \Newline\head{scala.jdk.CollectionConverters}\Newline {\small -Enable \code{.asJava} and \code{.asScala} conversions: \code{ import scala.jdk.CollectionConverters._ } +Enable \code{.asJava} and \code{.asScala} conversions: \code{ import scala.jdk.CollectionConverters.* } \vspace{0.5em} \begin{tabular}{@{}r c l} diff --git a/quickref/quickref.tex b/quickref/quickref.tex index 3e9eae468..c997bd1cc 100644 --- a/quickref/quickref.tex +++ b/quickref/quickref.tex @@ -201,7 +201,7 @@ \begin{document} \LangMarker{Scala}{1.5cm}{8} -\LangTitle{Scala 3.0 Quick Ref @ Lund University} +\LangTitle{Scala 3.1 Quick Ref @ Lund University} {\centering https://github.com/lunduniversity/introprog/tree/master/quickref \\ {\small \Version. License: CC-BY-SA, \textcopyright~Lund University. Pull requests welcome! Contact: Bjorn Regnell}\\ %{\small Pull requests welcome! Contact: bjorn.regnell at cs.lth.se} @@ -288,8 +288,8 @@ \begin{tabular}{@{}p{\FirstColWidth} l l}\MoveUp Trait -& \code|trait T { defsAndDecl }| & \hspace{-1.1em}\Comment{A trait is like an abstract class, but can be mixed in; can't have parameters.}\\ -& \code|class C extends D, T| & \hspace{-0.9em}\Comment{A class can only \textbf{extend} one class but mix in many traits separated with \code{,}}\\ +& \code|trait T(parameters) { defsAndDecl }| & \hspace{-0.5em}\Comment{A trait is like an abstract class, but can be mixed in.}\\ +& \code|class C extends D, T| & \hspace{-6.5em}\Comment{A class can only \textbf{extend} one class but \textbf{mix in} many traits separated with \code{,}}\\ \end{tabular} \begin{tabular}{@{}p{\FirstColWidth} l l}\MoveUp @@ -857,7 +857,7 @@ } %\Newline -\vspace*{-0.5em}\head{Mutation methods in trait \texttt{mutable.Buffer[A]}, \texttt{ArrayBuffer[A]}, \texttt{ListBuffer[A]} }\Newline +\vspace*{-0.8em}\head{Mutation methods in trait \texttt{mutable.Buffer[A]}, \texttt{ArrayBuffer[A]}, \texttt{ListBuffer[A]} }\Newline {\small\renewcommand{\arraystretch}{1.125} \begin{tabular}{@{}p{5cm} p{6.6cm}} \texttt{xs(i) = x~~~~~xs.update(i, x)} & Replace element at index i with x. Return type Unit.\\ \cline{1-2} @@ -870,7 +870,7 @@ \texttt{xs -= x} & Remove first occurance of x (if exists). Returns xs itself. \\\cline{1-2} -\texttt{xs ++= ys} & Appends all elements in ys to xs and returns xs itself. \\\cline{1-2} +\texttt{xs ++= ys~~~xs.addAll(ys)} & Appends all elements in ys to xs and returns xs itself. \\\cline{1-2} \end{tabular} } @@ -899,13 +899,13 @@ \Newline \vspace*{-0.5em}\head{Additional mutation methods in trait \texttt{mutable.Set[A]}}\Newline {\small\renewcommand{\arraystretch}{1.125} -\begin{tabular}{@{}p{5cm} p{6.6cm}} +\begin{tabular}{@{}p{4.5cm} p{7.1cm}} \texttt{xs~+=~x~~~~~xs~-=~x} & Returns the same set with included/excluded elements. \\ \cline{1-2} -\texttt{xs ++= ys} & Adds all elements in ys to set xs and returns xs itself. \\\cline{1-2} +\texttt{xs ++= ys~~~xs.addAll(ys)} & Adds all elements in ys to set xs and returns xs itself. \\\cline{1-2} -\texttt{xs.add(x)~~~xs.remove(x)} & Adds/removes x to xs and returns true if x was in xs, else false. \\\cline{1-2} +\texttt{xs.add(x)~~~xs.remove(x)} & Adds/removes x to xs and returns true if xs was mutated, else false. \\\cline{1-2} %\texttt{xs retain p~~~xs.clear} & Keeps only elements that satisfy predicate p. Remove all.\\ \cline{1-2} \texttt{xs(x) = b ~ xs.update(x, b)} & If b is true, adds x to xs, else removes x. Return type Unit.\\ \cline{1-2} @@ -964,7 +964,7 @@ \end{tabular} } -\vspace{1.0em}\head{Factory examples:}\Newline +\vspace{0.75em}\head{Factory examples:}\Newline {\small% \Comment{On mutable Set, Map:} \code{toSet}, \code{toMap} \Comment{returns immutable}; diff --git a/quiz/QuizData.scala b/quiz/QuizData.scala index 9b0606030..ea741bc18 100644 --- a/quiz/QuizData.scala +++ b/quiz/QuizData.scala @@ -200,7 +200,8 @@ object QuizData { // to generate tables for a concept connection quizes in late "modul " -> "kodenhet med abstraktioner som kan återanvändas", "singelobjekt " -> "modul som kan ha tillstånd; finns i en enda upplaga", "paket " -> "modul som skapar namnrymd; maskinkod får egen katalog", - "import " -> "gör namn tillgängligt utan att hela sökvägen behövs", + "import " -> "gör namn tillgängligt lokalt utan att hela sökvägen behövs", + "export " -> "gör namn synligt utåt som medlem i detta objekt", "lat initialisering" -> "allokering sker först när namnet refereras", "medlem " -> "tillhör ett objekt; nås med punktnotation om synlig", "attribut " -> "variabel som utgör (del av) ett objekts tillstånd", diff --git a/quiz/build.sbt b/quiz/build.sbt index 25e8b6b18..b704544b3 100644 --- a/quiz/build.sbt +++ b/quiz/build.sbt @@ -1 +1 @@ -ThisBuild/scalaVersion := "3.0.1" +ThisBuild/scalaVersion := "3.1.2" diff --git a/quiz/project/build.properties b/quiz/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/quiz/project/build.properties +++ b/quiz/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/quiz/quiz-concepts.tsv b/quiz/quiz-concepts.tsv index 07797cff9..1f5e3611b 100644 --- a/quiz/quiz-concepts.tsv +++ b/quiz/quiz-concepts.tsv @@ -17,6 +17,7 @@ defaultargument gör att argument kan utelämnas dynamisk bindning körtidstypen avgör vilken metod som körs element objekt i en datastruktur exekveringsfel kan inträffa medan programmet kör +export gör namn synligt utåt som medlem i detta objekt fabriksmetod hjälpfunktion för indirekt konstruktion flyttal decimaltal med begränsad noggrannhet for-sats bra då antalet repetitioner är bestämt i förväg @@ -27,7 +28,7 @@ förseglad typ subtypning utanför denna kodfil är förhindrad generisk har abstrakt typparameter, typen är generell getter indirekt åtkomst av attributvärde implementation en specifik realisering av en algoritm -import gör namn tillgängligt utan att hela sökvägen behövs +import gör namn tillgängligt lokalt utan att hela sökvägen behövs inmixning tillföra egenskaper med with och en trait innehållslikhet instanser anses lika om de har samma tillstånd instans upplaga av ett objekt med eget tillståndsminne diff --git a/show-scala-version.sh b/show-scala-version.sh index 6e4b222b2..96ce8b7b1 100755 --- a/show-scala-version.sh +++ b/show-scala-version.sh @@ -3,4 +3,4 @@ find . -type f -name build.sbt -exec grep -H "scalaVersion" {} \; echo " *** sbt versions in sbt.version ***" find . -type f -name build.properties -exec grep -H "sbt.version" {} \; -#sed -i 's/scalaVersion := "2.13.3"/scalaVersion := "2.13.5"/g' workspace/*/build.sbt +#sed -i 's/scalaVersion := "3.0.1"/scalaVersion := "3.1.2"/g' workspace/*/build.sbt diff --git a/slides/body/lect-w01-about.tex b/slides/body/lect-w01-about.tex index 06b2931d0..7a39e092a 100644 --- a/slides/body/lect-w01-about.tex +++ b/slides/body/lect-w01-about.tex @@ -23,8 +23,8 @@ \hyphenation{intro-duktion sekvens-algoritmer kod-strukturer data-strukturer} {%\fontsize{11}{13}\selectfont \renewcommand{\arraystretch}{1.75} -\begin{longtable}{@{}p{.05\textwidth} | >{\hspace{0.1em}\raggedright\bfseries\sffamily}p{.15\textwidth} >{\raggedleft\arraybackslash\hspace{0.0em}%\fontsize{10.5}{12}\selectfont -}p{0.735\textwidth}} +\begin{longtable}{@{}p{.05\textwidth} | >{\hspace{0.1em}\raggedright\bfseries\sffamily}p{.20\textwidth} >{\raggedleft\arraybackslash\hspace{0.0em}%\fontsize{10.5}{12}\selectfont +}p{0.730\textwidth}} \input{../plan/module-plan-generated.tex} \end{longtable} } @@ -34,11 +34,11 @@ \ifkompendium\else \begin{SlideExtra}{Vem går pgk?} \begin{itemize}%\SlideFontSmall - \item D1|C1: Nybörjare på Datateknik|Infocom, kursen är obligatorisk men du skulle ändå ha registrera dig i Ladok och svarat på upprop i Canvas! Om du inte gjort det kontakta studievägledare: \url{mailto:asa_k.nilsson@lth.lu.se} + \item D1|C1: Nybörjare på Datateknik|Infocom, kursen är obligatorisk men du ska ändå registrera dig i Ladok + upprop i Canvas! Om du \Alert{inte} gjort det kontakta genast studievägledare: \url{https://www.student.lth.se/kontakt/studie-och-karriaervaegledare/} \item Dx|Cx: Andra LTH-studenter som är omregistrerade i senare årskurs eller bytt till Datateknik|Infocom \item W: Ekosystemteknik-studenter årskurs 3 (eller senare) som vet allt om hur man pluggar på LTH -- \emph{respect!} - \item Fri: Fristående studenter som läser TFRD48 - \item Övr: Andra som läser kursen pga speciella anledningar (tex LTH-doktorander). + %\item Fri: Fristående studenter som läser TFRD48 + \item Övr: Andra specialstudenter (tex doktorander). \end{itemize} \end{SlideExtra} @@ -49,7 +49,7 @@ \item[] Här finns det mesta, t.ex. dessa bilder, annat kursmaterial, hur du installerar verktyg på din egen dator etc. \item[] Lär dig hitta på hemsidan -- den är stor \Eng{great} \item[] - \item Kursens \Alert{slutna} sida bakom inloggningsvägg: \url{https://canvas.education.lu.se/courses/14153} + \item Kursens \Alert{slutna} sida bakom inloggningsvägg: \url{https://canvas.education.lu.se/courses/20123} \item[] Här finns administrativ information om efterbeställning av bokpaket, gruppindelning, föreläsningsdeltagarlista, hemlig invit till Discord-server etc. \item[] Håll koll på s.k. ''anslag'' i Canvas så du inte missar viktiga uppdateringar. \item[] Du måste ha studentkonto, läs noga här: \url{http://www.student.lth.se/antagen-online/} @@ -116,7 +116,6 @@ \begin{SlideExtra}{Kursutveckling och förnyelse}\SlideFontSmall \begin{itemize} \item \Emph{Scala} är förstaspråk på Datateknik (D) sedan \Emph{2016}. -\item \Emph{Scala} är förstaspråk på InfoCom (C) sedan \Emph{2021}. \item Den \Alert{största förnyelsen} av den inledande programmeringskursen sedan vi införde \Emph{Java 1997}. \begin{itemize}\SlideFontTiny \item Nya föreläsningar @@ -124,9 +123,9 @@ \item Nya laborationer \item Ny examination \end{itemize} -\item Scala är förstaspråk på Infocom (C) sedan 2021. +\item \Emph{Scala} är förstaspråk på InfoCom (C) sedan \Emph{2021}. \item \Alert{Scala 3} sedan 2021 med stora förenklingar för nybörjare + nya avancerade koncept för proffsen. -\item Ny examination från 2021: muntligt prov + valfri tenta +\item \Emph{Ny examination} från 2021: muntligt prov + valfri tenta \item Kursmaterialet är \Emph{öppen källkod} och \Alert{fritt} tillgängligt. \item \Emph{Studentmedverkan} i kursutvecklingen: \begin{itemize}\SlideFontTiny @@ -139,13 +138,12 @@ \begin{SlideExtra}{Historik förstaspråk på D \& C vid LTH} \begin{table} \begin{tabular}{l l} - \Emph{Scala 3} & \Emph{2021} (C, D)\\ - \Emph{Scala 2} & \Emph{2016} (D)\\ -Java & 1997 (D), 2001 (C), InfoCom-programmet grundades\\ -Simula & 1990 \\ -Pascal & 1982, Datateknik-programmet grundades\\ + \Emph{Scala} & \Emph{2016 (D), 2021 (C)}\\ +Java & 1997 (D), 2001 (C), InfoCom-programmet grundas\\ +Simula & 1990 (D)\\ +Pascal & 1982 (D), Datateknik-programmet grundas\\ -Algol & förhistoria med hålkortsprogrammering \\ +Algol & (F, E, ...) förhistoria med hålkortsprogrammering \\ \end{tabular} \end{table} \pause\vfill{\SlideFontTiny \Emph{Scalas uppfinnare} \Alert{Professor Martin Odersky} vid EPFL i Lausanne, Schweiz, har även skrivit stora delar av Java-kompilatorn, och var en gång i tiden doktorand för Prof. Niklaus Wirth, som låg bakom Algol, Pascal, Modula m.m. Första versionen av Scala kom 2004. \url{https://en.wikipedia.org/wiki/Scala_(programming_language)}} @@ -192,8 +190,8 @@ \ifkompendium\else \begin{SlideExtra}{Kurslitteratur} \begin{minipage}{0.6\textwidth}\SlideFontSmall -\hskip1.33em\includegraphics[width=0.35\textwidth]{../img/compendium-cover-part1-2021.png}% -~~~\includegraphics[width=0.348\textwidth]{../img/compendium-cover-part2-2021.png} +\hskip1.33em\includegraphics[width=0.35\textwidth]{../img/compendium-cover-part1-2022}% +~~~\includegraphics[width=0.348\textwidth]{../img/compendium-cover-part2-2022} \begin{itemize} \item \Emph{Kompendium}\\med övningar \& laborationer, \\trycks till självkostnad enl. beställning,\\se info bakom Canvas-väggen. \item Föreläsningsbilder på kurshemsidan \\ @@ -206,13 +204,14 @@ Bra \Alert{bredvidläsning}:\\ -- för \Emph{nybörjare}: \vskip0.2mm -\includegraphics[width=0.33\textwidth]{../img/lewisbook.jpg}\hskip4mm +\includegraphics[width=0.45\textwidth]{../img/lewisbook.jpg}\hskip4mm %\includegraphics[width=0.33\textwidth]{../img/ankbok.jpg} \noindent -- för de som \Emph{redan kan OO}: \vskip0.7mm \includegraphics[width=0.45\textwidth]{../img/pinsbook}\hskip4mm %\includegraphics[width=0.47\textwidth]{../img/koffmanbook.jpg} +\\Se \url{https://cs.lth.se/pgk/litteratur/} \end{minipage} \end{SlideExtra} \fi @@ -232,7 +231,7 @@ \item För de som redan kodat en hel del i ett objektorienterat språk: \begin{itemize}[nolistsep, noitemsep] \item ''Programming in Scala'', Fifth Edition (2021), Martin Odersky, Lex Spoon, and Bill Venners. - \item Martin Odersky är upphovspersonen bakom Scala och denna välskrivna bok innehåller en komplett genomgång av Scala-språket med många exempel och tips. ''Fifth Edition'' täcker Scala version3. Boken riktar sig till de som redan har kunskap om något objektorienterat språk, t.ex. Java. Det finns ett bra index som gör det lätt att anpassa din läsning efter kursens upplägg. Bokens ca 800 sidor innehåller mycket material som är på en mer avancerad nivå än denna kurs, men du kommer att ha nytta av innehållet i kommande kurser. + \item Martin Odersky är upphovspersonen bakom Scala och denna välskrivna bok innehåller en komplett genomgång av Scala-språket med många exempel och tips. ''Fifth Edition'' täcker nya Scala 3. Boken riktar sig till de som redan har kunskap om något objektorienterat språk, t.ex. Java eller C\#. Det finns ett bra index som gör det lätt att anpassa din läsning efter kursens upplägg. Bokens ca 800 sidor innehåller mycket material som är på en mer avancerad nivå än denna kurs, men du kommer att ha nytta av innehållet i kommande kurser. % \item ''Data Structures: Abstraction and Design Using Java, 3rd Edition'', Elliot B. Koffman, Paul A. T. Wolfgang. \\ % \href{http://eu.wiley.com/WileyCDA/WileyTitle/productCd-1119186528.html}{http://eu.wiley.com/WileyCDA/WileyTitle/productCd-1119186528.html} \end{itemize} @@ -627,6 +626,7 @@ \item Samarbete gör att man lär sig bättre, men man lär sig \Alert{inte} av att kopiera andras lösningar. \item \Alert{Plagiering är förbjuden} och kan medföra \Alert{disciplinärende och avstängning}. \item Du får \Alert{INTE} lägga ut laborationslösningar öppet på \Emph{\code{github}} eller på annan plats där någon annan kan komma åt dem! +\item Det är \Alert{INTE} tillåtet att använda artificiell intelligens i arbetet med laborationer och projekt. \end{itemize} \end{SlideExtra} diff --git a/slides/body/lect-w01-intro.tex b/slides/body/lect-w01-intro.tex index e60e4b77d..4ac811242 100644 --- a/slides/body/lect-w01-intro.tex +++ b/slides/body/lect-w01-intro.tex @@ -900,6 +900,7 @@ %%%%%%%%%% +\Subsection{Kontrollstrukturer} \begin{Slide}{Kontrollstrukturer: alternativ och repetition}\SlideFontSmall Används för att kontrollera (förändra) sekvensen och skapa \Emph{alternativa} vägar genom koden. Vägen bestäms vid körtid. @@ -946,7 +947,7 @@ for (i <- 1 to 10) println(s"gurka nr $i") \end{Code} -\item Kojo som används på veckans lab kör ännu Scala 2, så du behöver använda gamla syntaxen för kontrollstrukturer i Kojo. +\item Kojo Desktop funkar ännu bara med Scala 2 och gamla syntaxen, men Kojo kan även köras med Scala 3 (se hur i kompendiet). \end{itemize} @@ -1012,6 +1013,24 @@ \end{Slide} +\Subsection{Veckans uppgifter} + +\begin{Slide}{Övning \texttt{expressions} och labb \texttt{kojo}} +\label{w01:kojo-slide} +\begin{itemize} + \item På övningen kör du Scala REPL för att träna på SARA. + \item[] \Alert{Läs i Appendix} och på kursens hemsida under ''Verktyg'' om hur du installerar och får igång Scala REPL. + \item På laborationen använder du barnvänliga \Emph{Kojo} för träna på SARA, med fokus på abstraktion. + \item Det finns tre olika sätt att använda Kojo: + \begin{enumerate} + \item Grafikbiblioteket \textbf{\texttt{kojolib}} i ett fristående Scala program med hjälp av en professionell kodeditor och kompilering och exekvering i terminalen. \Emph{Fungerar fint med nya Scala 3}. + \item Skrivbordsappen \textbf{Kojo Desktop} med inbyggd barnvänlig editor (endast Scala 2). + \item Webbappen \textbf{\url{http://kojo.lu.se/}} som körs direkt i din webbläsare (endast Scala 2, begränsade funktioner). + \end{enumerate} +\end{itemize} +Alternativ 1 rekommenderas, men om du försenas av tekniskt strul, så kom igång med 2 el. 3 så länge tills du fått hjälp. +\end{Slide} + \ifkompendium\else \begin{SlideExtra}{Om veckans övning: \code{expressions}}\SlideFontSmall diff --git a/slides/body/lect-w02-codestruct.tex b/slides/body/lect-w02-codestruct.tex index de0ca20d4..8039405ff 100644 --- a/slides/body/lect-w02-codestruct.tex +++ b/slides/body/lect-w02-codestruct.tex @@ -533,26 +533,28 @@ \end{Slide} -\begin{Slide}{För kännedom (överkurs): Scala-\textbf{skript}} +\begin{Slide}{För kännedom: Scala-\textbf{skript}} \begin{itemize} -\item Scala-kod kan köras som ett \Emph{skript}.\footnote{\SlideFontTiny Du provar detta på övningen. Vi kommer mest att köra kompilerat i kursen, då Scala-skript saknar mekanism för inkludering av andra skript. Men det finns ett öppenkällkodsprojekt som löser det: \url{http://www.lihaoyi.com/Ammonite/} + \item +\SlideFontSmall +Scala-kod kan köras som ett \Emph{skript}.\footnote{\SlideFontTiny Vi kommer inte använda skript i kursen, då dessa ej kan inkludera kod i andra skript. } -\item Ett skript kompileras varje gång innan det körs och maskinkoden sparas inte som vid vanlig kompilering. -\item Då behövs ingen \code{main} i ett \code{object} -\end{itemize} +Ett skript kompileras separat varje gång innan det körs och maskinkoden sparas \emph{inte} som vid vanlig kompilering. + Då behövs inget huvudprogram \code{@main} som i exempel nedan: -\begin{Code}[basicstyle=\ttfamily\fontsize{10}{12}\selectfont] +\begin{Code} // spara nedan i filen 'myscript.scala' println("Hej alla mina argument:") for arg <- args do println("Hej: " + arg) \end{Code} - +Inkludera \code{.scala} i filnamnet om du vill köra som skript. \begin{REPLnonum} > scala myscript.scala \end{REPLnonum} - - +\item +Det är lätt hänt att av misstag skriva \code{scala Huvudprogram.scala}, när man egentligen vill köra ett kompilerat huvudprogram. Vid körning av kompilerat huvudprogram ska \emph{inte} filändelsen \code{.scala} vara med. +\end{itemize} \end{Slide} diff --git a/slides/body/lect-w03-functions.tex b/slides/body/lect-w03-functions.tex index 135709e58..2282efa79 100644 --- a/slides/body/lect-w03-functions.tex +++ b/slides/body/lect-w03-functions.tex @@ -16,6 +16,33 @@ % \end{SlideExtra} % \fi +\Subsection{Abstraktion} + +\begin{Slide}{Vad är abstraktion?} +\begin{itemize} + \item \Emph{Abstraktion} innebär att skapa en förenklad \Emph{modell} ur konkreta detaljer + \item Vi ''hittar på'' nya \Emph{begrepp} som ger oss återanvändbara ''byggblock'' för våra tankar och vår kommunikation + \item Vi får ett abstrakt \Emph{namn} som kan användas i stället för en massa \Alert{konkreta detaljer} + \item Skilj på abstraktionens \Emph{namn} (begrepp, koncept), dess \Emph{användning} (anrop) och dess detaljerade \Emph{beskrivning} (definition, implementation) + \item \Emph{Funktioner} (som du redan känner från matematiken) är en av våra \Alert{viktigaste} abstraktionsmekanismer +\end{itemize} +\url{https://sv.wikipedia.org/wiki/Abstraktion} +\url{https://en.wikipedia.org/wiki/Abstraction} +\end{Slide} + +\begin{Slide}{Exempel på abstraktionsmekanismer inom datavetenskapen} +Vi kommer att behandla flera olika, alltmer \Emph{kraftfulla} abstraktionsmekanismer i denna kurs: +\begin{itemize} + \item Funktioner + \item Objekt + \item Klasser + \item Arv + \item Generiska strukturer + \item Kontextuella abstraktioner +\end{itemize} +Dessa abstraktionsmekanismer blir \Emph{extra kraftfulla} om de \Alert{kombineras}! +\end{Slide} + \Subsection{Vad är en funktion?} @@ -260,6 +287,19 @@ \end{tabular} \end{Slide} +\begin{Slide}{Anropsstacken i Kojo Desktop} +Tryck på orange playknapp i Kojo och se anropsstacken.\vspace{0.5em} + +\includegraphics[width=1.0\textwidth]{../img/kojo-trace.png} +\end{Slide} + +\begin{Slide}{Anropsstacken i VS Code} +Lägg till en brytpunkt på rad 4 nedan och klicka på debug över \code{@main} i VS Code och se anropsstacken.\vspace{0.5em} + +\includegraphics[width=0.85\textwidth]{../img/vscode-trace.png} +\end{Slide} + + \begin{Slide}{Vad är en stack trace?}\SlideFontSmall När du letar buggar vid körtidsfel har du nytta av att \Alert{noga studera} \Emph{utskriften av anropsstacken} \Eng{stack trace}: % \begin{CodeSmall} @@ -272,7 +312,7 @@ % safeDiv(weightKg, heightCm * heightCm) % def safeDiv(numerator: Int, denominator: Int): (Int, String) = -% if (denominator == 0) (numerator / denominator, "ok") // ser du buggen? +% if (denominator == 0) (numerator / denominator, "") // ser du buggen? % else (0, "division by zero") % \end{CodeSmall} @@ -284,7 +324,7 @@ safeDiv(weightKg, heightCm * heightCm) def safeDiv(numerator: Int, denominator: Int): (Int, String) = - if denominator == 0 then (numerator / denominator, "ok") // ser du buggen? + if denominator == 0 then (numerator / denominator, "") // ser du buggen? else (0, "division by zero") \end{Code} diff --git a/slides/body/lect-w04-objects.tex b/slides/body/lect-w04-objects.tex index a30d2f09a..761493b83 100644 --- a/slides/body/lect-w04-objects.tex +++ b/slides/body/lect-w04-objects.tex @@ -728,7 +728,7 @@ \begin{Slide}{Vad är en klass?} En klass kan användas för att skapa många objekt av samma typ. Varje upplaga har sitt eget tillstånd och kallas en \Emph{instans} av klassen (mer om detta nästa vecka). \begin{Code} -class Bankkonto(val kontonr: Long, var saldo: Int): // deklarera en klass +class Bankkonto(val kontonr: Long, var saldo: Int): // klassbeskrivning def ärSkuldsatt: Boolean = saldo < 0 \end{Code} \pause @@ -776,12 +776,13 @@ \end{Slide} -%\Subsection{Extensionsmetoder} +\Subsection{Extensionsmetoder} + \begin{Slide}{Lägg till metoder i efterhand med \texttt{extension}}\SlideFontSmall \begin{itemize}\SlideFontSmall \item Ofta vill man kunna lägga till metoder på godtyckliga typer i efterhand, speciellt när det gäller typer som finns i kod som någon annan skrivit. \item Detta går att göra i Scala med nyckelordet \code{extension}:\\{\SlideFontTiny\code{extension (s: String) def skrikBaklänges = s.reverse.toUpperCase}} -\item En extensionsmetod kan anropas med punktnotation som om den vore en medlem av typen. +\item En \Emph{extensionsmetod} kan anropas med \Alert{punktnotation} som om den vore en medlem av typen. \item Det går också att anropa en extensionsmetod som en fristående funktion utan punktnotation. \end{itemize} \begin{REPL} @@ -796,7 +797,22 @@ \end{REPL} \end{Slide} +\begin{Slide}{Kollektiva extensionsmetoder} +\begin{itemize} + \item +Det går bra att sammanföra flera funktioner under en och samma \code{extension} så här: +\begin{Code} +extension (s: String) + def baklänges = s.reverse + def skrik = s.toUpperCase +\end{Code} +\item Detta kallas \Emph{kollektiva extensionsmetoder}. +\item Notera att det \emph{inte} ska vara något kolon efter \code{extension}-deklarationens första rad. + +\end{itemize} +\end{Slide} +\Subsection{Mer om import} \begin{Slide}{Import av alla namn i en viss modul}\SlideFontSmall \begin{itemize} @@ -813,7 +829,7 @@ \item \Emph{Fördelar}: \begin{enumerate}\SlideFontTiny \item Slipper skriva import på varje enskilt namn. - \item De abstraktioner som är tänkta att användas tillsammans blir alla synliga i aktuell namnrymd \Eng{in scope}, i Scala t.ex. implicita värden m.m. + \item De abstraktioner som är tänkta att användas tillsammans blir alla synliga i aktuell namnrymd \Eng{in scope}. \end{enumerate} \item \Alert{Nackdelar}: \begin{enumerate}\SlideFontTiny @@ -863,13 +879,46 @@ \begin{Code} object A: def x = - import java.awt.Color - /* ... namnet Color syns bara lokalt i denna funktion */ + import java.awt.Color.RED + /* ... namnet RED syns bara lokalt i denna funktion */ \end{Code} %\item Detta går inte i Java, där import ska stå i början av filen. \end{itemize} \end{Slide} +\begin{Slide}{Export} +\begin{itemize}\SlideFontSmall + \item \code{import} ger direkt synlighet \Emph{lokalt} inuti en namnrymd + \item Med \code{export} kan du göra \emph{motsatsen} till import: \\ +göra medlemmar direkt synliga \Alert{utanför} en namnrymd. +\begin{CodeSmall} +object A: + import java.awt.Color.* // gör färger synliga direkt inuti detta objekt + def test = RED // färgen RED synlig direkt i lokala namnrymden + +object B: + export java.awt.Color.* // RED blir medlem som syns utåt via B.RED + export math.{sin, cos} // sin och cos blir metoder i B +\end{CodeSmall} + +\begin{REPLsmall} +scala> A.RED +-- [E008] Not Found Error: --------------------------------------------- +1 |A.RED + |^^^^^ + |value RED is not a member of object A + +scala> B.RED +val res0: java.awt.Color = java.awt.Color[r=255,g=0,b=0] + +scala> (B.cos(0), B.sin(0)) +val res1: (Double, Double) = (1.0,0.0) +\end{REPLsmall} +\end{itemize} + +\end{Slide} + +\Subsection{Dokumentation} \begin{Slide}{Skapa dokumentation} \code{scaladoc} är ett program som tar Scala-kod som indata och skapar en webbsajt med dokumentation. @@ -892,6 +941,7 @@ \draw [arrow] (scaladoc) -- (output); \end{tikzpicture} +\vspace*{1em}Läs mer i Appendix E: Dokumentation. %\vspace{2em} För Java-kod finns motsvarande program som heter \code{javadoc}. \end{Slide} @@ -909,8 +959,11 @@ \end{Slide} +\Subsection{Använda färdiga kodbibliotek} + \begin{Slide}{Vad är en jar-fil?} \begin{itemize} + \item Jar-filer används för att distribuera färdigkompilerad kod så att andra kan använda den enkelt \item Förkortningen \Emph{jar} kommer från ''Java Archive'' \item En \Emph{jar}-fil följer ett standardiserat filformat och används för att \Alert{paketera flera filer} i en och samma fil, exempelvis: \begin{itemize} @@ -925,6 +978,14 @@ \end{itemize} \end{Slide} +\begin{Slide}{Öppen källkod på Maven Central} +\begin{itemize} + \item På \Emph{Maven Central} som hanteras av företaget Sonatype finns tusentals öppet tillgängliga kodbibliotek publicerade som jarfiler. + \item Du kan söka bland alla Scala-bibliotek här: \\\url{https://index.scala-lang.org/} + \item Du kan söka bland alla bibliotek här: \\\url{https://search.maven.org/} +\end{itemize} +\end{Slide} + \begin{Slide}{Vad är \emph{classpath}?}\SlideFontSmall \begin{itemize} @@ -933,41 +994,84 @@ \item Kompilatorerna \code{scalac} och \code{javac} och programmen \code{scala} och \code{java} som kör igång JVM använder \Alert{en lista med filsökvägar} kallad \Emph{classpath} när de söker efter kompilerad kod. \pause \item Aktuell katalog samt Scalas standardbibliotek läggs automatiskt på classpath. -\item Med hjälp av optionen \code{-classpath} eller kortare \code{-cp} kan annan classpath anges. -\item En lista med kataloger separeras med kolon.\\(Windows: semikolon) -\item Det går bra att lägga jar-filer till listan med filsökvägar classpath. +\item Med hjälp av optionen \code{-cp} kan du ange innehållet på classpath genom att ge en lista med sökvägar separerade med kolon.\\(Windows: semikolon) +\item Det går bra att lägga till sökväg till jar-filer i listan. \item Exempel: (punkt används för att ange aktuell katalog) \begin{REPLnonum} -scala -cp "introprog_3-1.2.0.jar:." Main +scala -cp "introprog_3-1.3.1.jar:." Main \end{REPLnonum} \end{itemize} \end{Slide} \begin{Slide}{Färdiga grafikmetoder i klassen \texttt{PixelWindow}}\SlideFontSmall -På labben ska du använda klassen \code{introprog.PixelWindow} + \begin{itemize} -\item Jarfilen \code{introprog_3-1.2.0.jar} innehåller paketet \code{introprog} som bl.a. innehåller klassen \code{PixelWindow}. +\item På labben ska du använda en \texttt{.jar}-fil med kodbiblioteket \code{introprog}. %\item En \Emph{klass} är en ''mall'' för att göra \Emph{objekt}. -\item Med \code{PixelWindow} kan man skapa ritfönster. +\item Där finns klassen \code{PixelWindow} som kan skapa ritfönster. %\item När man skapar ett objekt från en klass använder man nyckelordet \code{new}. -\item Ladda ner \url{http://cs.lth.se/pgk/lib} och lägg sedan jar-filen i den katalog där du startar REPL med: \code{scala -cp introprog_3-1.2.0.jar} -%\pause +\item Ladda ner \url{https://fileadmin.cs.lth.se/introprog.jar} och lägg jar-filen i samma katalog där du startar REPL med: %\pause +\begin{REPLnonum} +> scala -cp introprog.jar +\end{REPLnonum} +\item Testa \code{PixelWindow} i REPL med: \begin{REPLnonum} -> scala -cp introprog_3-1.2.0.jar -repl scala> val w = introprog.PixelWindow(300, 200, "hejsan") \end{REPLnonum} -\item Notera behovet av \texttt{-repl} för att starta REPL med classpath. Från och med Scala 3.1.0 så behövs inte optionen \texttt{-repl}. -%\pause \item Studera dokumentationen för \code{introprog.PixelWindow} här: \\\url{http://cs.lth.se/pgk/api/} \end{itemize} \end{Slide} -\Subsection{Byggverktyget \texttt{sbt}} +\begin{Slide}{Använda färdiga kodbiblitek med Scala CLI i REPL:}\SlideFontSmall +\begin{itemize} +\item \code{scala-cli} kan inkludera en jar-fil på classpath med optionen \code{--jar} +\begin{REPLsmall} +> curl -sLO https://fileadmin.cs.lth.se/introprog.jar +> scala-cli repl . --jar introprog.jar +Welcome to Scala 3.1.3 (17.0.3, Java OpenJDK 64-Bit Server VM). +Type in expressions for evaluation. Or try :help. + +scala> introprog.Dialog.show("hello introprog") +\end{REPLsmall} +\item Du kan istället låta \code{scala-cli} \Emph{automatiskt} ladda ner ett färdigt kodbibliotek som är publicerat på Maven Central och lägga det på classpath med optionen \code{--dep} som är en förkortning av \emph{dependency}. Notera antalet kolon i adressen till kodbiblioteket: +\begin{REPLsmall} +> scala-cli repl . --dep se.lth.cs::introprog:1.3.1 +Welcome to Scala 3.1.3 (17.0.3, Java OpenJDK 64-Bit Server VM). +Type in expressions for evaluation. Or try :help. + +scala> introprog.Dialog.show("hello introprog") +\end{REPLsmall} +\end{itemize} + +\end{Slide} + + +\begin{Slide}{Köra program + kodbiblitek med Scala CLI}\SlideFontTiny +\begin{itemize} +\item \code{scala-cli} kan inkludera kodbibliotek från Maven Central om du skriver en ''magisk'' kommentar i början av din \code{.scala-}filen: +\begin{Code} +//> using scala "3" +//> using lib "se.lth.cs::introprog:1.3.1" + +@main def run = introprog.Dialog.show("hello introprog") +\end{Code} +Notera \texttt{>} efter \texttt{//} + +\item När du kör ditt program såhär så kommer Scala CLI att ladda ner kodbiblioteket om det inte redan är gjort: +\begin{REPLsmall} +> scala-cli run . +\end{REPLsmall} +\item Läs mer här:\\\url{https://index.scala-lang.org/lunduniversity/introprog-scalalib} och i Appendix C, stycket om Scala CLI. Mer om \code{//> using} här: +\item[] \url{https://scala-cli.virtuslab.org/docs/reference/directives} +\end{itemize} + +\end{Slide} + \begin{Slide}{Scala Build Tool: \texttt{sbt}}\SlideFontSmall \begin{itemize} -\item Du kan låta \code{sbt} automatiskt sköta omkompilering och körning vid varje Ctrl+S med kommandot \code{~run} +\item Du kan låta byggverktyget \code{sbt} automatiskt sköta omkompilering och körning vid varje Ctrl+S med kommandot \code{~run} och enbart omkompilering med \code{~compile} \begin{REPL} > sbt # kör igång sbt i en katalog med .scala-filer @@ -978,13 +1082,13 @@ Avsluta med Enter. Om flera \code{main} gör: \code{ ~runMain DettaMainObj} \item Kod antas finnas direkt i \Emph{aktuell katalog} eller i \code{src/main/scala} \item Lägg \code{.jar}-filer i en katalog \code{lib} så hamnar de automatiskt på classpath -\item Om du vill: skapa en fil med namnet \code{build.sbt} som konfigurerar \code{sbt} +\item Skapa en fil med namnet \code{build.sbt} för att säkerställa rätt version: \begin{Code} -scalaVersion := "3.0.1" // ange version av Scala-kompilatorn +scalaVersion := "3.1.3" \end{Code} I filen \code{project/build.properties} kan du ange versionen på \code{sbt}: \begin{Code} -sbt.version=1.5.5 +sbt.version=1.6.2 \end{Code} Se Appendix F i kompendiet och \url{http://www.scala-sbt.org/} \end{itemize} @@ -993,12 +1097,12 @@ \begin{Slide}{Använda \texttt{introprog} tillsammans med \texttt{sbt}} -Lägg detta i filen \code{build.sbt}: +Lägg raden med \code{libraryDependencies} i filen \code{build.sbt} efter \code{scalaVersion}: \begin{Code} -scalaVersion := "3.0.1" -libraryDependencies += "se.lth.cs" %% "introprog" % "1.2.0" +scalaVersion := "3.1.3" +libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" \end{Code} -Första gången du kör \code{compile}, \code{run} eller \code{console} i \code{sbt} kommer en jar-fil med paketet \code{introprog} automatiskt att laddas ner från webbplatsen \Emph{Sonatype Maven Central} där många öppenkällkodspaket finns fritt tillgängliga. \\~\\ +Första gången du kör \code{compile}, \code{run} eller \code{console} i \code{sbt} kommer en jar-fil med paketet \code{introprog} automatiskt att laddas ner från Maven Central. \end{Slide} diff --git a/slides/body/lect-w05-classes.tex b/slides/body/lect-w05-classes.tex index 894472e94..c2bd7cd58 100644 --- a/slides/body/lect-w05-classes.tex +++ b/slides/body/lect-w05-classes.tex @@ -66,6 +66,7 @@ \item Med klasser kan du skapa \Alert{nya} typer (utöver \code{Int}, \code{String} ...) som bättre representerar domänens data. \item Med klasser implementerar du modeller som representerar väsentliga \Emph{attribut} ur applikationsdomänen. \item Med \Emph{metoder} (funktioner i klasser) kan du skapa och behandla domänens data. +\item Datamodellering i Scala görs ofta med \code{case}-klasser och \Emph{oföränderliga} instanser. \end{itemize} % \TODO förklara nyttan med att göra otillåtna tillstånd omöjliga att representera, begrepp skapar ett nytt domänspecifikt språk \end{Slide} @@ -338,7 +339,7 @@ Kan vi få se något som är finare än \code{Person@783dc0e7} ? \end{Slide} -\begin{Slide}{Skapa najs toString} +\begin{Slide}{Skapa egen najs toString} \begin{Code}[basicstyle=\SlideFontSize{6.9}{9}\ttfamily] class Person( val givenName: String, @@ -382,7 +383,34 @@ res0: Int = 85 \end{REPL} ...eftersom modifieraren \code{private val} ger en medlem som ''bara'' är \Emph{klassprivat} och ger därmed synlighet i \Alert{alla} \code{D}-instanser (men bara där; medlemmen är inte ens synlig i subtyper till \code{D}). -\item Observera att modifierarlösaparametrar till case-klasser ger publik medlem. +\end{itemize} + +\end{Slide} + +\begin{Slide}{Case-klasser är som vanliga klasser med extra godis} +\SlideFontTiny +Med \code{case} framför \code{class} får du en massa \Emph{godis} på köpet, bland annat detta: +\begin{itemize}\SlideFontTiny +\item En najs \code{toString}-metod med klassens namn och dess attributvärden. +\begin{REPLsmall} +scala> case class Person(name: String, age: Int) + +scala> val p = Person("Björn", 55) + +scala> p.toString +val res0: String = Person(Björn,55) + +\end{REPLsmall} +\item Parameter till case-klass blir automatiskt ett \Emph{publikt oföränderligt attribut}, alltså en \code{val}-medlem utan att du behöver skriva något. +\begin{REPLsmall} +scala> p.age +val res1: Int = 55 +\end{REPLsmall} +\item En \code{copy}-metod med alla attribut som parametrar och instansens attributvärden som default-argument. Den gör det smidigt att skapa förändrade kopior där några attribut ändrats och andra förblir som innan. +\begin{REPLsmall} +scala> p.copy(age = p.age + 1) +val res2: Person = Person(Björn,56) +\end{REPLsmall} \end{itemize} \end{Slide} @@ -789,8 +817,9 @@ Case-klasser är ett smidigt sätt att skapa \Emph{oföränderliga} datastrukturer. Med nyckelordet \code{case} framför \code{class} får du mycket ''godis på köpet'': \begin{itemize} -\item Klassparametrar blir automatiskt publika\footnote{alltså \Alert{inte} instansprivata som i vanliga klasser.} oföränderliga attribut och du slipper alltså skriva \code{val} -\item Du får en automatisk \Emph{toString} med klassens namn och värdet av alla \code{val}-attribut som ges av klassparametrarna och du slipper alltså skriva en egen toString +\item Klassparametrar blir automatiskt publika\footnote{alltså \Alert{inte} instansprivata som i vanliga klasser.} oföränderliga attribut och du slipper alltså skriva \code{val}. +\item Du får en automatisk \Emph{toString} med klassens namn och värdet av alla \code{val}-attribut som ges av klassparametrarna +\item och en \Emph{copy}-metod för att skapa nya, delvis förändrade instanser, med attributvärdena som defaultargument. \item Du får ett automatiskt kompanjonsobjekt med en fabriksmetod \code{apply} för indirekt instansiering där alla klassparametrarnas \code{val}-attribut initialiseras. \pause \item ... och mer därtill men mer om det senare... diff --git a/slides/body/lect-w05-specifications.tex b/slides/body/lect-w05-specifications.tex index 40e29ab26..1c48c9476 100644 --- a/slides/body/lect-w05-specifications.tex +++ b/slides/body/lect-w05-specifications.tex @@ -33,7 +33,7 @@ case class Person(name: String, age: Int): def ärTonåring = age >= 13 && age <= 19 def ärUng = !ärGammal - def ärGammal: Boolean = ??? //def ännu ej bestämd + def ärGammal: Boolean = ??? //implementation ännu ej klar \end{Code} \begin{REPLnonum} scala> Person("Björn", 51).ärTonåring diff --git a/slides/body/lect-w06-exceptions.tex b/slides/body/lect-w06-exceptions.tex index 5877380d5..3026cbe3f 100644 --- a/slides/body/lect-w06-exceptions.tex +++ b/slides/body/lect-w06-exceptions.tex @@ -206,4 +206,12 @@ scala> min("hello".toIntOption) val res2: Long = 157 \end{REPLsmall} +\end{Slide} + +\begin{Slide}{Fördjupning: Kontrollerade undantag} +\begin{itemize} +\item Det finns möjligheter i Scala att låta kompilatorn kontrollera om undantag hanteras. +\item Läs mer här: \\ \url{https://docs.scala-lang.org/scala3/reference/experimental/canthrow.html} +\end{itemize} + \end{Slide} \ No newline at end of file diff --git a/slides/body/lect-w11-context.tex b/slides/body/lect-w11-context.tex index b68a96230..f0accfe4e 100644 --- a/slides/body/lect-w11-context.tex +++ b/slides/body/lect-w11-context.tex @@ -44,7 +44,7 @@ \end{itemize} \end{Slide} -\begin{Slide}{Övre och undre typgränser}\SlideFontSmall +\begin{Slide}{Övre och undre typgräns}\SlideFontSmall Med typoperatorerna \code{<:} och \code{>:} går det att begränsa vilka typer som kan bindas till en typparameter i en generiska struktur. \vspace{0.5em}Antag att \code{T} är en obunden typparameter medan \code{U} och \code{L} är bundna. @@ -67,7 +67,7 @@ \end{Slide} -\begin{Slide}{Exempel på övre och undre typgränser} +\begin{Slide}{Exempel på övre och undre typgräns} \begin{Code} class Djur @@ -138,7 +138,7 @@ scala> val djur: Vector[Djur] = Vector[Katt](Katt()) val djur: Vector[Djur] = Vector(Katt()) \end{REPL} -\pause \code{Vector} är deklarerad som kovariant och därmed mer flexibel! +\pause \code{Vector} är deklarerad som \Emph{kovariant} och därmed mer flexibel! \end{Slide} @@ -160,11 +160,19 @@ scala> val djurbur: Bur[Djur] = Bur[Katt](Katt()) val djurbur: Bur[Djur] = Bur(Katt()) \end{REPL} -\item En kattbur är nu en \Alert{subtyp} till djurbur! +\item \code{Bur[Katt]} är nu en \Alert{subtyp} till \code{Bur[Djur]}. \pause \item \Emph{Oföränderliga} samlingar görs ofta kovarianta, t.ex Vector, Option. -\item Enumerationer blir mer flexibla om du gör dem kovarianta: +\item Generiska enumerationer blir mer flexibla om du gör dem kovarianta: +\ifkompendium +\begin{Code} +enum Toalett[+T]: + case Upptagen(x: T) + case Ledig +\end{Code} +\else \item[] \code|enum Toalett[+T] { case Upptagen(x: T); case Ledig }| +\fi \end{itemize} \end{Slide} @@ -178,11 +186,11 @@ \begin{Slide}{Kontravarians} \begin{center} -En djurveterinär är en kattveterinär!? +Är en kattveterinär också en djurveterinär? -\includegraphics[width=0.75\textwidth]{../img/cat-vet.jpg} +\includegraphics[width=0.70\textwidth]{../img/cat-vet.jpg} -Ibland vill vi ha variansen på andra hållet. +Ibland vill vi ha variansen på andra hållet: En veterinär som bara kan behandla katter ska inte få behandla vilket djur som helst. \end{center} \end{Slide} @@ -196,8 +204,8 @@ case class Katt() extends Djur case class Hund() extends Djur -class Veterinär[-A]: // kontravariant med - - def behandla(x: A) = println(s"frisk: " + x) +class Veterinär[-A]: // kontravariant med - + def behandla(x: A) = println(s"$this har behandlat $x") \end{Code} \pause \item Nu funkar det ''baklänges'' (men inte på andra hållet): @@ -358,7 +366,7 @@ \item Till vår räddning, fler coola FP-grejer: \begin{itemize}\SlideFontTiny \item \Emph{Kontextuella abstraktioner}: möjliggör (på annat ställe) \Emph{givna} värden som finns \emph{implicit} (alltså underförstått, utan att vi behöver explicit skriva ut dem). - \item \Emph{Ad hoc polymorfism}: möjliggör olika implementationer beroende på typ, \emph{statiskt} härledda och utan att det behöver finnas en arvsrelation + \item \Emph{Ad hoc polymorfism}: möjliggör olika implementationer beroende på typ, \emph{statiskt} härledda och utan att det behöver finnas en arvsrelation. \end{itemize} \end{itemize} \end{Slide} @@ -396,7 +404,7 @@ \pause \item Kan vi ta detta ett steg till och \Alert{frikoppla} deklarationen av funktionen \Emph{från} det givna värdet, och ge detta på annan plats baserat på typen? \pause -\item I Scala 3 görs detta med nyckelorden \code{given} resp. \code{using}\\(i Scala 2 (över)användes nyckelordet \code{implicit}) +\item I Scala 3 görs detta med nyckelorden \code{given} resp. \code{using}\\(i Scala 2 användes gamla nyckelordet \code{implicit}) \end{itemize} \end{Slide} @@ -518,53 +526,41 @@ Framkallning av givna värden vid anrop med kontextparametrar har flera namn på engelska: \emph{to summon}, eller \emph{term inference}, eller \emph{implicit resolution}. \end{Slide} -\begin{Slide}{Ad hoc polymorfism, ''typklasser''}\SlideFontSmall -\begin{itemize}\SlideFontSmall -\item Ad hoc polymorfism innebär att en abstrakt typkonstruktor ges olika konkreta implementationer för olika typer och appliceras automatiskt. +\begin{Slide}{Ad hoc polymorfism med typklasser}\SlideFontTiny +\begin{itemize}\SlideFontTiny +\item Med Ad hoc polymorfism kan det finnas \emph{olika} implementationer för \emph{olika} typer \emph{utan} användning av arv (\code{extends}). \item Uppfanns i språket ML och vidareutvecklades i språket Haskell. -\item I Haskell kallas Ad hoc polymorfism för ''typklasser''. \\(En förvirrande term; Haskell är inte objekt-orienterat...) -\item Ad hoc polymorfism / Typklasser görs i Scala genom att \Emph{kombinera} parametrisk polymorfism med kontextuella abstraktioner. +\item I Haskell kallas mekanismen för Ad hoc polymorfism för \Emph{typklass}. %\\(En förvirrande term; Haskell är inte objekt-orienterat...) +\item Typklasser skapas i Scala genom att \Emph{kombinera} parametrisk polymorfism (typparametrar) med kontextuella abstraktioner (given-using). +\item En \Emph{typklass i Scala} är en tillståndslös \code{trait} med minst en typparameter och minst en abstrakt metod. \end{itemize} -\begin{Code} -trait Parser[T]: +\begin{CodeSmall} +trait Parser[T]: // en typklass för att tolka och omvandla strängar till godtycklig typ def fromString(value: String): Option[T] -object Parser: - given Parser[Int] with // with behövs för givna instanser om abstrakt typ +object Parser: // olika implementationer erbjuds som givna värden + given Parser[Int] with // nyckelordet with behövs då given implementerar abstrakt metod def fromString(value: String): Option[Int] = value.toIntOption -\end{Code} -\begin{REPL} -scala> def parse[T](s: String)(using p: Parser[T]) = p.fromString(s) +\end{CodeSmall} +\begin{itemize}\SlideFontTiny +\item Den specifika implementationen framkallas via en kontextuell parameter: +\end{itemize} +\begin{REPLsmall} +scala> def parseOrElse[T](s: String)(using p: Parser[T]) = p.fromString(s) -scala> parse[Int]("12") +scala> parseOrElse[Int]("12") val res0: Option[Int] = Some(12) -\end{REPL} -\end{Slide} - -\begin{Slide}{Parameternamnet kan skippas efter \texttt{using}} -\begin{itemize} -\item Eftersom namnet på det givna värdet ofta inte behövs\\ -- det är ju typen som är det viktiga för framkallningen, \\ så kan du skippa parameternamnet:% - -\begin{Code}[basicstyle=\ttfamily\SlideFontSize{10}{14}\selectfont] -def parse[T](s: String)(using Parser[T]) = - summon[Parser[T]].fromString(s) -\end{Code} -\item Framkallningen kan vid behov istället% -\footnote{Ett vanligt parameternamn är annars \code{ev} som är en förkortning av \emph{evidence}, vilket anspelar på att kompilatorn -- om koden kompilerar utan fel -- har hittat ett giltigt \emph{bevis} för att det givna värdet verkligen existerar \textbf{vid anrop}.} - göras med \code{summon}% - -\end{itemize} +\end{REPLsmall} \end{Slide} - -\begin{Slide}{Hur få ''typklassen'' \texttt{Parser} att funka för fler typer?} +\begin{Slide}{Hur få typklassen \texttt{Parser} att funka för fler typer?} \begin{REPL} -scala> parse[java.awt.Color]("Color(120,10,0)") +scala> parseOrElse[java.awt.Color]("Color(120,10,0)") -- Error: -1 |parse[java.awt.Color]("Color(120,10,0)") +1 |parseOrElse[java.awt.Color]("Color(120,10,0)") | ^ | no implicit argument of type Parser[java.awt.Color] was found - | for parameter p of method parse + | for parameter p of method parseOrElse \end{REPL} \begin{Code} given Parser[java.awt.Color] with @@ -575,20 +571,44 @@ case _ => None \end{Code} \begin{REPL} -scala> parse[java.awt.Color]("Color(120,10,0)") +scala> parseOrElse[java.awt.Color]("Color(120,10,0)") val res1: Option[java.awt.Color] = Some(java.awt.Color[r=120,g=10,b=0]) \end{REPL} \end{Slide} -\begin{Slide}{Kontextgränser}\SlideFontSmall +\begin{Slide}{Namnet på kontextparametrar kan utelämnas}\SlideFontSmall +\begin{itemize}\SlideFontSmall +\item Namnet på det givna värdet behövs ofta inte -- det är ju \emph{typen} som är det viktiga. +\item Därför är det tillåtet att utelämna parameternamnet vid \code{using}. +\item Det givna värdet kan istället framkallas med \code{summon} vid behov:% +\begin{Code} +def parseOrElse[T](s: String)(using Parser[T]) = + summon[Parser[T]].fromString(s) +\end{Code} +% \pause +% \item Om du placerar en \code{apply} i typklassens kompanjonsobjekt som gör samma jobb som \code{summon} så kan du skriva detta ännu kortare: +% \begin{CodeSmall} +% def parseOrElse[T](s: String)(using Parser[T]) = Parser[T].fromString(s) +% \end{CodeSmall} +% \item En sådan ''framkallnings-apply'' kan se ut så här: +% \begin{CodeSmall} +% object Parser: +% def apply[T](using p: Parser[T]) = p +% \end{CodeSmall} +\end{itemize} + +\end{Slide} + + +\begin{Slide}{Kontextgräns}\SlideFontSmall Denna form av \code{using}-parametrar... \begin{Code} -def parse[T](s: String)(using p: Parser[T]) = ??? +def parseOrElse[T](s: String)(using Parser[T]) = ??? \end{Code} -...där en typkonstruktor för typparametern ska framkallas är så pass vanlig att Scala erbjuder ett kortare och mer lättläst skrivsätt: +...är så vanliga att Scala har ett kortare skrivsätt som kallas \Emph{kontextgräns}: \begin{Code} -def parse[T: Parser](s: String) = ??? +def parseOrElse[T: Parser](s: String) = ??? \end{Code} Om \code{F[A]} är en typkonstruktor och du skriver \code{[T: F]} så blir \code{F} en så kallad \Emph{kontextgräns} \Eng{context boundary}. Kompilatorn expandera detta automatiskt till kontextparametern \code{(using F[T])} @@ -596,7 +616,7 @@ -\begin{Slide}{Ännu smidigare användning med extensionsmetod}\SlideFontSmall +\begin{Slide}{Ännu smidigare typklass med extensionsmetod}\SlideFontSmall Kombinera kontextgräns med extensionsmetod och få smidig punktnotation. \begin{Code} extension [T: Parser](s: String) @@ -618,17 +638,42 @@ \end{Slide} +% \begin{Slide}{Typklass med samlade smidigheter}\SlideFontSmall +% Om vi samlar ihop alla smidighetstrick får vi ett typiskt typklassexempel: +% \begin{CodeSmall} +% trait Parser[T]: +% def fromString(value: String): Option[T] + +% extension (s: String) +% def parseOrElse(default: T): T = fromString(s).getOrElse(default) + +% object Parser: +% given intParser: Parser[Int] with +% def fromString(value: String): Option[Int] = value.toIntOption +% given colorParser: Parser[java.awt.Color] with +% def fromString(value: String): Option[java.awt.Color] = +% val trimmed = value.trim.stripPrefix("Color(").stripSuffix(")") +% trimmed.split(",").map(_.toIntOption) match +% case Array(Some(r), Some(g), Some(b)) => Some(java.awt.Color(r, g, b)) +% case _ => None +% \end{CodeSmall} +% \begin{REPLsmall} +% scala> import Parser.intParser +% scala> "12".parse +% val res0: Option[Int] = Some(12) +% \end{REPLsmall} +% \end{Slide} \begin{Slide}{Sortera samlingar med given ordning}\SlideFontSmall \begin{REPLsmall} scala> case class Gurka(namn: String, vikt: Int) - + scala> val xs = Vector(Gurka("a", 100), Gurka("b", 50), Gurka("c", 100)) val xs: Vector[Gurka] = Vector(Gurka(a,100), Gurka(b,50), Gurka(c,100)) - + scala> xs.sorted -- Error: 1 |xs.sorted @@ -654,16 +699,18 @@ \begin{Slide}{Sortera samlingar med ännu smidigare given ordning}\SlideFontSmall +\begin{itemize} + \item Det är vanligt att man vill definiera egna ordningsrelationer. + \item Därför finns en smidig hjälpmetod i kompanjonsobjektet för typklassen \code{Ordering} som heter \code{fromLessThan}: \begin{Code} -given Ordering[Gurka] = Ordering.fromLessThan((g1, g2) => g1.vikt < g1.vikt) +given Ordering[Gurka] = + Ordering.fromLessThan((g1, g2) => g1.vikt < g1.vikt) \end{Code} - - -\begin{itemize} - \item Det är vanligt att man vill ge ordningar. - \item Därför finns en smidig hjälpmetod i kompanjonsobjektet för typklassen \code{Ordering} som heter \code{fromLessThan} - \item Den tar som inparameter en funktion som tar två instanser och returnerar en boolean som är true om den första är ''mindre'' (alltså kommer före) enligt valfri definition. - \item Den returnerar en \code{Ordering} som kan erbjudas som ett givet värde. + + \item Den tar som inparameter en funktion som tar två instanser som ska ordnas och ger \code{true} om den första ska anses \Emph{mindre} (alltså kommer \Alert{före}) enligt valfri definition. + \item \code{fromLessThan} returnerar en \code{Ordering} som du kan låta vara givet. + \item Prova gärna detta på veckans fördjupningsövningar. + \item Läs mer om typklasser i Scala här: \\ \url{https://docs.scala-lang.org/scala3/reference/contextual/type-classes.html} \end{itemize} \end{Slide} diff --git a/slides/body/lect-w12-project-assignment.tex b/slides/body/lect-w12-project-assignment.tex index 3d3743c04..b592cc111 100644 --- a/slides/body/lect-w12-project-assignment.tex +++ b/slides/body/lect-w12-project-assignment.tex @@ -4,11 +4,9 @@ %%% -\ifkompendium\else - \Subsection{Om projektuppgiften} -\begin{SlideExtra}{Om din avslutande projektuppgift}\SlideFontSmall +\begin{Slide}{Om din avslutande projektuppgift}\SlideFontSmall \Emph{Läs noga kompendium Del 1, kapitel -1 avsnitt ''Projektuppgift''!} \\ Några citat: \begin{itemize} @@ -21,7 +19,7 @@ %\item Övning \code{extra} i kapitel 14, där du gör en enkel web-server och experimenterar med trådar, kan vara lämplig som grund för projektuppgift för de som vill fördjupa sig \Alert{bortom} kursens innehåll. -\item Du ska skapa automatiskt genererad dokumentation med \code{scaladoc} enligt beskrivning i appendix E. +\item Inför redovisningen ska du skapa automatiskt genererad dokumentation utifrån relevanta dokumentationskommentarer för minst hälften av dina publika metoder, enligt instruktioner i Appendix E. \item Redovisning sker i datorsal på schemalagd tid: \begin{itemize}\SlideFontTiny @@ -31,9 +29,9 @@ \end{itemize} \end{itemize} -\end{SlideExtra} +\end{Slide} -\begin{SlideExtra}{Projektuppgifter}\SlideFontTiny +\begin{Slide}{Projektuppgifter}\SlideFontTiny \begin{itemize}\SlideFontTiny \item \code{bank} @@ -70,7 +68,10 @@ \end{itemize} -\end{SlideExtra} +\end{Slide} + +\ifkompendium\else + \begin{SlideExtra}{Kom på föreläsning om systemutveckling!} \begin{itemize} diff --git a/slides/body/lect-w12-search.tex b/slides/body/lect-w12-search.tex index 676ac88b5..5c6a61ba8 100644 --- a/slides/body/lect-w12-search.tex +++ b/slides/body/lect-w12-search.tex @@ -19,7 +19,7 @@ scala> timed { xs.indexOf(enMiljon) } // linjärsökning res42: (Double, Int) = (0.016622994,999999) -scala> import scala.collection.Searching._ // ger tillgång till metoden search +scala> import scala.collection.Searching.* // ger tillgång till metoden search import scala.collection.Searching._ scala> timed { xs.search(enMiljon) } // binärsökning diff --git a/slides/body/lect-w13-on-demand.tex b/slides/body/lect-w13-on-demand.tex index 8aecc814e..8a1557f2e 100644 --- a/slides/body/lect-w13-on-demand.tex +++ b/slides/body/lect-w13-on-demand.tex @@ -94,20 +94,18 @@ \newcommand{\Vecka}[1]{\hfill\href{https://fileadmin.cs.lth.se/pgk/lect-w#1.pdf}{w#1}} -\begin{Slide}{Önskemål repetitionsämnen} +\begin{Slide}{Exempel på repetitionsämnen} +Gör en lista på saker du behöver repetera.\\Exempel på önskade repetitionsämnen från tidigare år: \begin{itemize}\SlideFontSmall - \item \code{enum}: när och hur? eller case-klass? \Vecka{07} + \item closure (''fångad variabelrymd'') \Vecka{03} \item Skillnad på objekt och singelobjekt? \Vecka{04} \item Mönstermatchning. \Vecka{06} - \item Typhärledning. \Vecka{08} - \item När använda vilken sekvenstyp? \Vecka{07} - \item \code{unapply} \Vecka{06} - \item \code{Try} med stort T \Vecka{06} \item \code{Option} \Vecka{06} + \item \code{Try} med stort T \Vecka{06} + \item \code{enum}: när och hur? eller case-klass? \Vecka{07} + \item När använda vilken sekvenstyp? \Vecka{07} + \item Typhärledning. \Vecka{08} \item komposition eller arv? \Vecka{10} - \item extensionsmetoder \Vecka{11} - \item rekursion\Vecka{03} - \item closure (''fångad variabelrymd'') \Vecka{03} \end{itemize} \end{Slide} @@ -170,27 +168,27 @@ \end{itemize} \end{Slide} -\begin{Slide}{ArrayBuffer} -Ändra på plats: update, insert, remove, append -{\SlideFontTiny +% \begin{Slide}{ArrayBuffer} +% Ändra på plats: update, insert, remove, append +% {\SlideFontTiny -\vspace{2.5em}\begin{tabular}{@{}p{4.2cm} p{6.5cm}} -\texttt{xs(i) = x \newline xs.update(i, x)} & Replace element at index i with x. \newline Return type Unit.\\ \cline{1-2} +% \vspace{2.5em}\begin{tabular}{@{}p{4.2cm} p{6.5cm}} +% \texttt{xs(i) = x \newline xs.update(i, x)} & Replace element at index i with x. \newline Return type Unit.\\ \cline{1-2} -\texttt{xs.insert(i, x)\newline xs.remove(i)} & Insert x at index \texttt{i}. Remove element at i. \newline Return type Unit.\\ \cline{1-2} +% \texttt{xs.insert(i, x)\newline xs.remove(i)} & Insert x at index \texttt{i}. Remove element at i. \newline Return type Unit.\\ \cline{1-2} -\texttt{xs.append(x)~~~xs~+=~x} & Insert x at end. Return type Unit.\\ \cline{1-2} +% \texttt{xs.append(x)~~~xs~+=~x} & Insert x at end. Return type Unit.\\ \cline{1-2} -\texttt{xs.prepend(x)~~x~+=:~xs} & Insert x in front. Return type Unit.\\ \cline{1-2} +% \texttt{xs.prepend(x)~~x~+=:~xs} & Insert x in front. Return type Unit.\\ \cline{1-2} -\texttt{xs -= x} & Remove first occurance of x (if exists). \newline Returns xs itself. \\\cline{1-2} +% \texttt{xs -= x} & Remove first occurance of x (if exists). \newline Returns xs itself. \\\cline{1-2} -\texttt{xs ++= ys} & Appends all elements in ys to xs and returns xs itself. \\ +% \texttt{xs ++= ys} & Appends all elements in ys to xs and returns xs itself. \\ -\end{tabular} -} +% \end{tabular} +% } -\end{Slide} +% \end{Slide} \Subsection{Tentatips} diff --git a/slides/body/lect-wjava-body.tex b/slides/body/lect-wjava-body.tex index d80c473c1..e925d4f88 100644 --- a/slides/body/lect-wjava-body.tex +++ b/slides/body/lect-wjava-body.tex @@ -14,7 +14,7 @@ \item Översätta Java till Scala och från Scala till Java \item Undersöka autoboxning \Eng{autoboxing} \item Använda \code{import scala.jdk.CollectionConverters._} -\item[] Utfasad \Eng{deprecated} sedan Scala 2.13.0: \code{import scala.collection.JavaConverters._} +%\item[] Utfasad \Eng{deprecated} sedan Scala 2.13.0: \code{import scala.collection.JavaConverters._} \end{itemize} \item Laboration \code{javatext}: \begin{itemize}\SlideFontTiny @@ -1162,7 +1162,7 @@ \item Med \code{new java.util.Scanner("hej 42")} kan man även scanna en sträng. -\item Scanna \code{Int} och \code{Double} med metoderna \code{nextInt} och \code{nextDouble}. Se doc: \href{https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html}{\SlideFontTiny docs.oracle.com/javase/8/docs/api/java/util/Scanner.html} +\item Scanna \code{Int} och \code{Double} med metoderna \code{nextInt} och \code{nextDouble}.\\Se doc: \href{https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html}{\SlideFontTiny docs.oracle.com/javase/8/docs/api/java/util/Scanner.html} \end{itemize} \end{Slide} diff --git a/slides/generated/w02-overview-generated.tex b/slides/generated/w02-overview-generated.tex index 9fcb424de..2ae938333 100644 --- a/slides/generated/w02-overview-generated.tex +++ b/slides/generated/w02-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Program, kontrollstrukturer}: Övn \Alert{\texttt{programs}} $\rightarrow$ Labb \Alert{\texttt{--}} + Modul \Emph{Program och kontrollstrukturer}: Övn \Alert{\texttt{programs}} $\rightarrow$ Labb \Alert{\texttt{--}} \begin{multicols}{3}\SlideFontTiny $\square$ huvudprogram \\ $\square$ program-argument \\ diff --git a/slides/generated/w03-overview-generated.tex b/slides/generated/w03-overview-generated.tex index cb80b6f54..bf7f17974 100644 --- a/slides/generated/w03-overview-generated.tex +++ b/slides/generated/w03-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Funktioner, abstraktion}: Övn \Alert{\texttt{functions}} $\rightarrow$ Labb \Alert{\texttt{irritext}} + Modul \Emph{Funktioner och abstraktion}: Övn \Alert{\texttt{functions}} $\rightarrow$ Labb \Alert{\texttt{irritext}} \begin{multicols}{3}\SlideFontTiny $\square$ abstraktion \\ $\square$ funktion \\ diff --git a/slides/generated/w04-overview-generated.tex b/slides/generated/w04-overview-generated.tex index 7965fee38..56b4fbb9d 100644 --- a/slides/generated/w04-overview-generated.tex +++ b/slides/generated/w04-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Objekt, inkapsling}: Övn \Alert{\texttt{objects}} $\rightarrow$ Labb \Alert{\texttt{blockmole}} + Modul \Emph{Objekt och inkapsling}: Övn \Alert{\texttt{objects}} $\rightarrow$ Labb \Alert{\texttt{blockmole}} \begin{multicols}{3}\SlideFontTiny $\square$ modul \\ $\square$ singelobjekt \\ @@ -17,6 +17,7 @@ $\square$ import \\ $\square$ selektiv import \\ $\square$ namnbyte vid import \\ +$\square$ export \\ $\square$ tupel \\ $\square$ multipla returvärden \\ $\square$ block \\ diff --git a/slides/generated/w05-overview-generated.tex b/slides/generated/w05-overview-generated.tex index 471e42b5f..e0178882b 100644 --- a/slides/generated/w05-overview-generated.tex +++ b/slides/generated/w05-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Klasser, datamodellering}: Övn \Alert{\texttt{classes}} $\rightarrow$ Labb \Alert{\texttt{--}} + Modul \Emph{Klasser och datamodellering}: Övn \Alert{\texttt{classes}} $\rightarrow$ Labb \Alert{\texttt{--}} \begin{multicols}{3}\SlideFontTiny $\square$ applikationsdomän \\ $\square$ datamodell \\ diff --git a/slides/generated/w06-overview-generated.tex b/slides/generated/w06-overview-generated.tex index 471d08d3b..9dfb2b1f1 100644 --- a/slides/generated/w06-overview-generated.tex +++ b/slides/generated/w06-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Mönster, felhantering}: Övn \Alert{\texttt{patterns}} $\rightarrow$ Labb \Alert{\texttt{blockbattle}} + Modul \Emph{Mönster och felhantering}: Övn \Alert{\texttt{patterns}} $\rightarrow$ Labb \Alert{\texttt{blockbattle}} \begin{multicols}{3}\SlideFontTiny $\square$ mönstermatchning \\ $\square$ match \\ diff --git a/slides/generated/w07-overview-generated.tex b/slides/generated/w07-overview-generated.tex index 2c5d5110c..34df581a3 100644 --- a/slides/generated/w07-overview-generated.tex +++ b/slides/generated/w07-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Sekvenser, enumerationer}: Övn \Alert{\texttt{sequences}} $\rightarrow$ Labb \Alert{\texttt{shuffle}} + Modul \Emph{Sekvenser och enumerationer}: Övn \Alert{\texttt{sequences}} $\rightarrow$ Labb \Alert{\texttt{shuffle}} \begin{multicols}{3}\SlideFontTiny $\square$ översikt av Scalas samlingsbibliotek och samlingsmetoder \\ $\square$ klasshierarkin i scala.collection \\ diff --git a/slides/generated/w08-overview-generated.tex b/slides/generated/w08-overview-generated.tex index 0eaeb6dca..61ce7a321 100644 --- a/slides/generated/w08-overview-generated.tex +++ b/slides/generated/w08-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Matriser, typparametrar}: Övn \Alert{\texttt{matrices}} $\rightarrow$ Labb \Alert{\texttt{life}} + Modul \Emph{Nästlade och generiska strukturer}: Övn \Alert{\texttt{matrices}} $\rightarrow$ Labb \Alert{\texttt{life}} \begin{multicols}{3}\SlideFontTiny $\square$ matris \\ $\square$ nästlad samling \\ diff --git a/slides/generated/w09-overview-generated.tex b/slides/generated/w09-overview-generated.tex index 98595430a..88479d6d0 100644 --- a/slides/generated/w09-overview-generated.tex +++ b/slides/generated/w09-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Mängder, tabeller}: Övn \Alert{\texttt{lookup}} $\rightarrow$ Labb \Alert{\texttt{words}} + Modul \Emph{Mängder och tabeller}: Övn \Alert{\texttt{lookup}} $\rightarrow$ Labb \Alert{\texttt{words}} \begin{multicols}{3}\SlideFontTiny $\square$ innehållstest \\ $\square$ mängd \\ diff --git a/slides/generated/w10-overview-generated.tex b/slides/generated/w10-overview-generated.tex index f5bcc9597..801fff972 100644 --- a/slides/generated/w10-overview-generated.tex +++ b/slides/generated/w10-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Arv, komposition}: Övn \Alert{\texttt{inheritance}} $\rightarrow$ Labb \Alert{\texttt{snake0}} + Modul \Emph{Arv och komposition}: Övn \Alert{\texttt{inheritance}} $\rightarrow$ Labb \Alert{\texttt{snake0}} \begin{multicols}{3}\SlideFontTiny $\square$ arv \\ $\square$ komposition \\ diff --git a/slides/generated/w11-overview-generated.tex b/slides/generated/w11-overview-generated.tex index 6208faa81..c10b3ad07 100644 --- a/slides/generated/w11-overview-generated.tex +++ b/slides/generated/w11-overview-generated.tex @@ -1,11 +1,18 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Kontextparametrar, api}: Övn \Alert{\texttt{context}} $\rightarrow$ Labb \Alert{\texttt{snake1}} + Modul \Emph{Kontextuella abstraktioner och varians}: Övn \Alert{\texttt{context}} $\rightarrow$ Labb \Alert{\texttt{snake1}} \begin{multicols}{3}\SlideFontTiny - $\square$ given \\ -$\square$ using \\ -$\square$ extension \\ + $\square$ över- och undre typgräns \\ +$\square$ varians \\ +$\square$ kontravarians \\ +$\square$ kovarians \\ +$\square$ typjoker \\ +$\square$ egentyp \\ +$\square$ givet värde (given) \\ +$\square$ kontextparameter (using) \\ +$\square$ generiska extensionsmetoder \\ $\square$ ad hoc polymorfism \\ +$\square$ kontextgräns \\ $\square$ typklass \\ $\square$ api \\ $\square$ kodläsbarhet \\ diff --git a/slides/generated/w13-overview-generated.tex b/slides/generated/w13-overview-generated.tex index 110e78706..64764c727 100644 --- a/slides/generated/w13-overview-generated.tex +++ b/slides/generated/w13-overview-generated.tex @@ -4,5 +4,6 @@ \begin{multicols}{3}\SlideFontTiny $\square$ träna på extentor \\ $\square$ redovisa projekt \\ +$\square$ träna inför muntligt prov \\ \end{multicols} \ No newline at end of file diff --git a/slides/generated/w14-overview-generated.tex b/slides/generated/w14-overview-generated.tex index b078fccb6..4dbd53b80 100644 --- a/slides/generated/w14-overview-generated.tex +++ b/slides/generated/w14-overview-generated.tex @@ -1,6 +1,6 @@ %!TEX encoding = UTF-8 Unicode - Modul \Emph{Muntligt prov}: Övn \Alert{\texttt{Munta}} $\rightarrow$ Labb \Alert{\texttt{Munta}} + Modul \Emph{MUNTLIGT PROV}: Övn \Alert{\texttt{Munta}} $\rightarrow$ Labb \Alert{\texttt{Munta}} \begin{multicols}{3}\SlideFontTiny Repetera begrepp \end{multicols} diff --git a/slides/info-week00-online.tex b/slides/info-week00-online-2021.tex similarity index 100% rename from slides/info-week00-online.tex rename to slides/info-week00-online-2021.tex diff --git a/slides/info-week00.tex b/slides/info-week00.tex index ae2a24047..6e5d758a2 100644 --- a/slides/info-week00.tex +++ b/slides/info-week00.tex @@ -1,12 +1,13 @@ -\documentclass{lecturenotes} +%\documentclass{lecturenotes} +\documentclass{lecturesimple} -\newcommand{\DateOfShow}{2020-08-26} +\newcommand{\DateOfShow}{HT2022} %tisdag vecka 0 för D, onsdag för C \newcommand{\Startdag}{måndag} -\newcommand{\KursStartTidDod}{kl 10:15 Online} -\newcommand{\KursStartTidPgk}{kl 13:15 Hybrid (E:A+Online)} +\newcommand{\KursStartTidDod}{tisdag kl 15 i E:A} +\newcommand{\KursStartTidPgk}{måndag kl 13 i E:A} \title[Kort presentation av pgk \& dod, \DateOfShow]{\textbf{EDAA45} Programmering, grundkurs (pgk) \\ + \\ \textbf{EDAA60} Datorer och datoranvändning (dod)} -\author{\href{http://cs.lth.se/bjorn-regnell}{Björn Regnell}, \href{http://cs.lth.se/per-andersson/}{Roger Henriksson}} +\author{\href{http://cs.lth.se/bjorn-regnell}{Björn Regnell}, \href{https://cs.lth.se/marcus-klang/}{Marcus Klang}, \href{https://cs.lth.se/nordahl-mattias/}{Mattias Nordahl}} \institute{\href{http://cs.lth.se}{Datavetenskap}, LTH} \date{\DateOfShow} @@ -14,6 +15,17 @@ \frame{\titlepage} + +\begin{Slide}{Digitaliseringens 2 största utmaningar} + \begin{itemize}\Large + \item Hantera ständiga \Alert{komplexitetsökningen} + \item Åtgärda allt svårare \Alert{kompetensbristen} + \end{itemize} +\end{Slide} + +\SlideImg{Välutbildade inom IT är oerhört eftertraktade}{../img/kompetensbrist} + + \frame{\frametitle{En kurskombo som startar på \Startdag} Lägger grunden för alla kommande kurser i datavetenskap: \vspace{1em} \begin{itemize} @@ -29,6 +41,16 @@ \end{itemize} } + +\begin{Slide}{Tips för framgång i programmeringsstudier} + \begin{itemize} + \item Motivation att gå på djupet + \item Hårt arbete + \item Effektiv studieteknik + \item Uppmuntrande socialt sammanhang + \end{itemize} +\end{Slide} + \frame{\frametitle{Vad ska du lära dig?} %Att skapa koden som styr världen... %\includegraphics[width=1.2\textwidth, height=1.5cm]{img/code-wide} @@ -36,20 +58,22 @@ \begin{itemize}\Size{9pt} \item \textbf{Programmering, grundkurs} \begin{itemize}\Size{8pt} -\item Tänka i abstraktioner -\item Använda datastrukturer -\item Implementera algoritmer -\item Brepp som lägger grunden för resten av din utbildning -\item Språk: \Emph{Scala} (och lite Java) +\item Tänka i \Emph{abstraktioner} +\item Använda \Emph{datastrukturer} +\item Implementera \Emph{algoritmer} +\item Begrepp som lägger \Alert{grunden} för resten av din utbildning +\item Språk: \Emph{Scala} \end{itemize} \columnbreak \item \textbf{Datorer \& datoranvändning} \begin{itemize}\Size{8pt} -\item Lågnivåprogrammering -\item Datarepresentation -\item Terminalkommando i Linux -\item Skriva \& typsätta i \LaTeX -\item Beräkningar i Matlab +%\item Lågnivåprogrammering +%\item Datarepresentation +\item Terminalkommando i \Emph{Linux} +\item Skriva \& typsätta i \Emph{\LaTeX} +\item Versionhantering med \Emph{Git} +\item Koddelning med \Emph{Github} +%\item Beräkningar i Matlab \end{itemize} \end{itemize} \end{multicols} @@ -93,22 +117,47 @@ % \end{columns} % } + + +\SlideImg{Stor spridning i förkunskaper}{../img/survey-2022} + \begin{Slide}{Bokpaket} \begin{itemize} %\item Det är 117 D-are, 4 W-are och 4 fristående som beställt kursmaterial. Grattis! :) - \item D:are får bokpaket mot uppvisande av Swish-transaktion via faddrar: + \item C+D får beställt bokpaket mot uppvisande av Swish-transaktion via faddrar på fredag: \item[] *** Swishnummer: 123 170 4584 \item[] *** Ange meddelande: pgk \item[] *** Belopp: 455 kr - \item D-are som missat fadderutdelningen samt W:are och fristående hämtar på cs expedition under expeditionstider mot uppvisande av Swish-transaktion enl ovan. - \item Efterbeställning möjlig via Canvas. De första 10 får lägre priset därefter högre priset. + \item[] Denna info finns också i Canvas. + \item De som missat fadderutdelningen samt W:are på cs expedition under expeditionstider mot uppvisande av Swish-transaktion enl ovan. + \item \Emph{Efterbeställning} möjlig nu via Canvas. De första 10 får lägre priset 455, sen trycker vi enstaka till högre priset 775. \end{itemize} \end{Slide} +\frame[plain]{\frametitle{Beställ bokpaket!} +Bokpaketet är \Emph{fantastiskt!}\\~\\ +\url{http://cs.lth.se/pgk/bokpaket}\\~\\ +\Alert{Om du inte fyllt i den gör det nu!}\\ (Även om du svarar ''Nej'') +} +\frame{\frametitle{Välkommen till kursstart!} +Kom i god tid till första föreläsningen enl. \url{https://cs.lth.se/pgk/schema/timeedit/} +\begin{itemize} +\item pgk: \KursStartTidPgk +\item dod: \KursStartTidDod + +%\item[] \includegraphics[height=0.41\textheight]{../img/annexet} +\end{itemize} + +Besök öppna kurshemsidorna för mer information och slutna sidor i Canvas: +\begin{itemize} + \item \url{http://cs.lth.se/pgk} + \item \url{http://cs.lth.se/dod} +\end{itemize} + +} -\SlideImg{Stor spridning i förkunskaper}{../img/survey-2020} %%% AAAARGH -- version clash ? or something causing thins in Ubuntu 20.04 %%% but not in ubuntu 18.04: @@ -169,47 +218,59 @@ %%% -\frame[plain]{\frametitle{Beställ bokpaket!} -Bokpaketet är \Emph{fantastiskt!}\\~\\ -\url{http://cs.lth.se/pgk/bokpaket}\\~\\ -\Alert{Om du inte fyllt i den gör det nu!}\\ (Även om du svarar ''Nej'') -} -\frame[plain]{\frametitle{Förkunskapsenkät} - -Ditt svar på denna \Emph{förkunskapsenkät} används i planeringen: -\url{http://cs.lth.se/pgk/introsurvey}\\ -\Alert{Om du inte fyllt i den gör det nu!}\\ -\vspace{1em} -Enkäten innehåller dessa frågor och några till: -\begin{itemize} -\item Har du programmerat tidigare? \\ - Ja \hspace{2.5cm} Nej -\item Hur många program har du skrivit? \\ - $<5$ \hspace{2.2cm} $5-20$ \hspace{2.5cm} $>20$ -\item Hur stort var det största program du har skrivit?\\ - $<50$ rader \hspace{1cm} $50 - 500$ rader \hspace{1cm} $>500$ rader -\end{itemize} -\vspace{1em} -} +% \frame[plain]{\frametitle{Förkunskapsenkät} +% Ditt svar på denna \Emph{förkunskapsenkät} används i planeringen: +% \url{http://cs.lth.se/pgk/introsurvey}\\ +% \Alert{Om du inte fyllt i den gör det nu!}\\ +% \vspace{1em} +% Enkäten innehåller dessa frågor och några till: +% \begin{itemize} +% \item Har du programmerat tidigare? \\ +% Ja \hspace{2.5cm} Nej +% \item Hur många program har du skrivit? \\ +% $<5$ \hspace{2.2cm} $5-20$ \hspace{2.5cm} $>20$ +% \item Hur stort var det största program du har skrivit?\\ +% $<50$ rader \hspace{1cm} $50 - 500$ rader \hspace{1cm} $>500$ rader +% \end{itemize} +% \vspace{1em} +% } +% { +% \setbeamercolor{background canvas}{bg=black} +% \frame{\includegraphics[width=1.0\textwidth]{../img/abc80}} +% } +\begin{frame}\frametitle{Svensk skoldator från 1980-talet: ABC80} +\begin{center} + \includegraphics[width=1.0\textwidth]{../img/abc80} +\end{center} +\end{frame} -\frame{\frametitle{Välkommen till kursupprop på \Startdag!} -I matte-annexet (MA): -\begin{itemize} -\item dod: \KursStartTidDod -\item pgk: \KursStartTidPgk -\item[] \includegraphics[height=0.41\textheight]{../img/annexet} -\end{itemize} -Besök kurshemsidorna för mer information: -\begin{itemize} - \item \url{http://cs.lth.se/pgk} - \item \url{http://cs.lth.se/dod} -\end{itemize} +\begin{frame}\frametitle{Hårdvara 1986: IBM 3090, 69MHz, 128MB RAM} +\begin{center} + \includegraphics[width=1.0\textwidth]{../img/ibm3090.jpg} +% % http://hampage.hu/oldiron/e_ibms.html + + {\fontsize{5}{5}\selectfont\color{gray} + Foto: hampage.hu/oldiron + } +\end{center} +\end{frame} + +\begin{frame}\frametitle{Hårdvara 2014: Facebooks serverhall i Luleå, \\ 28000 kvm, 1 terrawatttimme per år} + \begin{center} + \includegraphics[width=1.05\textwidth]{../img/lulea-datacenter.jpg} + % https://nyadagbladet.se/wp-content/uploads/2013/06/lulea-datacenter.jpg + % http://gamla.hbl.fi/nyheter/2013-07-06/471016/facebook-placerade-serverhallar-i-lulea + + {\fontsize{5}{5}\selectfont\color{gray} + Foto: Facebook + } + \end{center} +\end{frame} -} \end{document} diff --git a/slides/lecturenotes.cls b/slides/lecturenotes.cls index d959c798d..00a76a06e 100644 --- a/slides/lecturenotes.cls +++ b/slides/lecturenotes.cls @@ -78,7 +78,7 @@ linkcolor=, linkbordercolor=mylinkcolor, urlbordercolor=mylinkcolor, urlcolor=my %https://tex.stackexchange.com/questions/81899/what-does-running-in-backwards-compatibility-mode-mean-and-what-should-i-fix-t %\pgfplotsset{compat=newest} %\pgfplotsset{compat=1.13} -\pgfplotsset{compat=1.15} +\pgfplotsset{compat=1.14} %https://www.sharelatex.com/blog/2013/08/29/tikz-series-pt3.html diff --git a/slides/lecturesimple.cls b/slides/lecturesimple.cls index 754352334..57bfd82c8 100644 --- a/slides/lecturesimple.cls +++ b/slides/lecturesimple.cls @@ -123,6 +123,7 @@ linkcolor=, linkbordercolor=mylinkcolor, urlbordercolor=mylinkcolor, urlcolor=my %https://tex.stackexchange.com/questions/81899/what-does-running-in-backwards-compatibility-mode-mean-and-what-should-i-fix-t %\pgfplotsset{compat=newest} %\pgfplotsset{compat=1.13} +\pgfplotsset{compat=1.14} %https://www.sharelatex.com/blog/2013/08/29/tikz-series-pt3.html diff --git a/util/build.sbt b/util/build.sbt index 83460e08f..c63b5609a 100644 --- a/util/build.sbt +++ b/util/build.sbt @@ -7,7 +7,7 @@ libraryDependencies += "jline" % "jline" % "2.14.2" lazy val commonSettings = Seq( organization := "se.lth.cs", version := "16.1", - scalaVersion := "3.0.1" + scalaVersion := "3.1.2" ) lazy val util = (project in file(".")). diff --git a/util/fixexercise/project/build.properties b/util/fixexercise/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/util/fixexercise/project/build.properties +++ b/util/fixexercise/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/util/mio.scala b/util/mio.scala index e71a2be26..a140628a4 100644 --- a/util/mio.scala +++ b/util/mio.scala @@ -1,8 +1,8 @@ /** An object with many useful input/output methods. * Run as scala script: `scala mio.scala` * Compile it with `scalac mio.scala` to put it on your classpath, - * or just paste the whole source file in the REPL using for example - * `:pa util/mio.scala` where `util` is the path to `mio.scala` + * or just load the whole source file in the REPL: + * `:load util/mio.scala` where `util` is the path to `mio.scala` */ object mio: import java.nio.file.{Path, Paths, Files} diff --git a/util/project/build.properties b/util/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/util/project/build.properties +++ b/util/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/util/repl-output-update-tool/build.sbt b/util/repl-output-update-tool/build.sbt index 3717f2815..533de7e4d 100644 --- a/util/repl-output-update-tool/build.sbt +++ b/util/repl-output-update-tool/build.sbt @@ -1 +1 @@ -scalaVersion := "3.0.1" +scalaVersion := "3.1.2" diff --git a/web/tools/tools.html b/web/tools/tools.html index 268a87323..b001a4a02 100644 --- a/web/tools/tools.html +++ b/web/tools/tools.html @@ -1,29 +1,19 @@ -

I denna kurs använder vi programmeringsspråket Scala och exekveringsmiljön OpenJDK, samt byggverktyget sbt och editorn vscode. Läs om hur du använder dessa och andra programmeringsverktyg i Appendix i kompendiet. Verktygen finns förinstallerade på LTH:s Linuxdatorer i E-huset. Instruktioner om hur du installerar dessa verktyg på din egen dator finns i Appendix i kompendiet och nedan.

+

I denna kurs använder vi programmeringsspråket Scala och olika programmeringsverktyg. Läs om hur du använder dessa programmeringsverktyg i Appendix i kompendiet. Verktygen finns förinstallerade på LTH:s Linuxdatorer i E-huset. Instruktioner om hur du installerar dessa verktyg på din egen dator finns nedan.

Programmera på LTH:s datorer

På LTH:s Linuxdatorer i E-huset finns alla de verktyg vi använder i kursen förinstallerade:

    -
  • Rekommenderad kodeditor: VS Code startas med kommandot code
  • -
  • Scala REPL; kommando: scala
  • +
  • Rekommenderad kodeditor: VS Code startas med kommandot code men innan du kör VS Code första gången: installera Scala-tillägg för VS Code med detta terminalkommando: code --install-extension scalameta.metals --force
  • +
  • Scala REPL; kommando: scala eller scala-cli repl .
  • Utvecklingsmiljön Kojo; kommando: kojo
  • -
  • Scala-kompilatorn; kommando: scalac
  • +
  • Scala-kompilatorn; kommando: scalac eller scala-cli compile .
  • Byggverktyget sbt; kommando: sbt
  • Java-kompilatorn; kommando: javac
  • Exekveringsmijlön JVM med tillhörande utvecklingsbibliotek (OpenJDK); kommando: java
  • Utvecklingsmiljön IntelliJ IDEA med Scala-plugin; kommando: idea

Programmera på din egen dator

-

Du behöver följande verktyg på din egen dator: Kojo, OpenJDK, sbt, VS Code med tillägget Scala (Metals). Läs om dessa i Appendix i kompendiet och följ instruktionerna nedan om hur du installerar verktygen på din egen dator.

-

Installera Kojo

-

Följ instruktioner här: http://www.kogics.net/kojo-download

-

Vi använder utvecklingsmiljön Kojo på första labben. Kojo är utvecklat speciellt för att hjälpa elever i grundskola och gymnasium att lära sig programmera. Kojo används på Vattenhallen Science Center.

-

LTH-studenter med programmeringskunskaper och intresse för pedagogik är välkomna att ansöka om att bli programmeringshandledare i Vattenhallen här: https://www.vattenhallen.lu.se/om-oss/kontakt/vh-student/student-intresseanmalan/

-

Installera kodeditor

-
    -
  • VS Code: rekommenderas i kursen, öppen källkod, alla plattformar. Installera tillägget Scala Metals via editorns tilläggshanterare (Extensions Ctrl+Shift+X), skriv i sök-rutan: Metals

  • -
  • Atom: öppen källkod, alla plattformar, paketet Scala Metals finns att installera i editorns tilläggshanterare.

  • -
  • Sublime Text: stängd källkod, alla plattformar, paketet Scala Metals finns att installera i editorns tilläggshanterare.

  • -
-

Läs mer om vad du kan göra med en kodeditor i appendix i kompendiet

+

Du behöver installera detta på din egen dator: OpenJDK, Scala, och VS Code med tillägget Scala (Metals). Läs mer om dessa verktyg i Appendix i kompendiet och följ instruktionerna nedan om hur du installerar verktygen på din egen dator.

+

(Om du redan använder SDKMAN och vill fortsätta med det så läs längre ner under "För dig som helst använder SDKMAN".)

Starta terminalfönster

Många av de programmeringsverktyg vi använder körs via ett terminalfönster. Du startar ett terminalfönster såhär:

-

Installera Java Development Kit (JDK)

-

Kontrollera om du redan har JDK: Du kanske redan har JDK installerat. Kontrollera detta genom att i ett terminalfönster skriva (observera avslutande c:et):

-
javac -version
-

Version 11 rekommenderas, men andra versioner kan ev. också fungera. Om utskriften säger att javac saknas, installera då OpenJDK enl. nedan.

-

Installera OpenJDK: Läs även instruktionerna i appendix i kompendiet innan du sätter igång.

+

Installera Java Development Kit (OpenJDK)

+

Du kanske redan har JDK installerat. Kontrollera detta genom att i ett terminalfönster skriva (observera avslutande c:et):

+
javac --version
+

Om utskriften säger att javac saknas eller anger en annan version än version 17 eller 11, installera då OpenJDK enl. nedan.

+

Installera OpenJDK: Läs även instruktionerna i appendix i kompendiet innan du sätter igång.

    -
  • Windows/Mac: Installera OpenJDK här https://adoptopenjdk.net/

    +
  • Linux/Ubuntu/WSL: Öppna terminalfönster och kör:

    +
    sudo apt install openjdk-17-jdk openjdk-17-source
  • +
  • Windows/Mac: Installera OpenJDK för ditt system härifrån: https://adoptium.net/

      -
    1. Välj att ladda ner OpenJDK version 11 (LTS) HotSpot för ditt operativsystem.
    2. -
    3. I hämtade filer dubbelklicka för installation med förifyllda val.
    4. +
    5. Välj att ladda ner OpenJDK version 17 (LTS) HotSpot för ditt operativsystem.
    6. +
    7. Dubbelklicka på filen som laddas ned för att starta installationen. Om du får en varning ska du köra ändå genom att klicka på "Mer information" eller liknande. Under installationen välj alla dessa åtgärder: Update PATH, Associate .jar, Set JAVA_HOME, JavaSoft registry key.
    8. Starta om din dator.
    9. -
    10. Starta terminalfönster och kontrollera enligt ovan att javac och java ger rätt version. -
        -
      • Om något krånglar: fråga någon som installerat JDK förr om hjälp.
      • -
    11. +
    12. Starta terminalfönster och kontrollera att javac --version ger rätt version. Om något krånglar: fråga någon som installerat JDK förr om hjälp.
  • -
  • Linux/Ubuntu/WSL: Öppna terminalfönster och kör: sudo apt install openjdk-11-jdk

-

Gör scala och scalac tillgängligt i terminalen

+

Installera Scala med tillhörande verktyg

+

Scala med tillhörande verktyg installeras enklast med hjälp av det officiella installationsverktyget Coursier enligt nedan. Du får då bl.a. följande terminalverktyg som du kan läsa om i kompendiet: scala, scalac, scala-cli, scaladoc, sbt.

    -
  • Linux/Ubuntu/WSL/MacOS: Scala installeras lättast med sdkman: +
  • Linux/Ubuntu/WSL:
      -
    • Testa att nedladdningsprogrammet curl finns på ditt system genom att skriva curl --version i terminalen. Om curl saknas så installera detta i terminalen genom att skriva:

      -
      sudo apt install curl
    • -
    • Om du inte redan gjort det, installera sdkman genom att öppna ett terminalfönster och kopiera och klistra in följande, en rad i taget:

      -
      curl -s "https://get.sdkman.io" | bash
      -source "$HOME/.sdkman/bin/sdkman-init.sh"
    • -
    • Installera Scala med kommandot sdk så här:

      -
      sdk install scala
    • -
    • Starta ett nytt terminalfönster och testa att skriva scala -version och om allt gått bra ska du få en utskrift som börjar med "Scala compiler version".

    • +
    • Installera OpenJDK enligt instruktioner ovan.
    • +
    • Testa om nedladdningsprogrammet curl finns på ditt system genom att skriva curl --version i terminalen. Om curl saknas så installera detta i terminalen genom att skriva: sudo apt install curl
    • +
    • Installera Scala-verktygen med detta långa terminalkommando på en och samma rad som slutar med ./cs setup:

      +
      curl -fL https://github.com/coursier/launchers/raw/master/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup
    • +
    • Starta om din dator.
    • +
    • Testa att skriva scala --version i ett nytt terminalfönster och om allt gått bra så ska du få en utskrift som börjar med "Scala code runner version 3".

  • -
  • Windows: För att ladda ner och installera Scala så att scalac och scala blir tillgängligt i terminalen i Windows, gör så här: +
  • Windows:
    • Installera OpenJDK enligt instruktioner ovan.
    • -
    • Ladda ned filen install-scala.bat via länken https://cs.lth.se/pgk/scala-windows och spara den t.ex. i Downloads och dubbel-klicka på den. Ett terminalfönster öppnas och kör igång nedladdning och uppdatering av path. När den är klar är det bara att starta en ny terminal och köra scala. -
        -
      • För att installera en specifik version av scala så kan man i terminalen ge versionsnummer som argument, t.ex:

        -
        install-scala.bat 3.1.0-RC1
      • +
      • Ladda ned filen cs-x86_64-pc-win32.zip och spara den på valfritt ställe och dubbel-klicka på den när nedladdningen är klar. Följ instruktionerna och svara jakande. Om du får varningar så kör ändå genom att klicka "Mer information" eller liknande.
      • +
      • Starta om din dator.
      • +
      • Testa att skriva scala --version i ett nytt terminalfönster och om allt gått bra så ska du få en utskrift som börjar med "Scala code runner version 3".
      • +
      • Om du har en tillräckligt ny Windows-maskin rekommenderas även WSL (se ovan under "Starta terminalfönster") som gör att du kan köra Linux/Ubuntu under Windows och då installera Scala-verktyg enligt instruktioner för Linux.
    • -
    • Om du har tillräckligt ny Windows-maskin rekommenderas även WSL (se ovan under "Starta terminalfönster") som gör att du kan köra Linux/Ubuntu under Windows och då installera ovan verktyg enligt instruktioner för Linux.
    • -
    • Det finns också några lovande alternativ under utveckling som ska göra det ännu enklare att komma igång med Scala, där scala-cli rekommenderas: +
    • MacOS:
    • +
    • Installera OpenJDK enligt instruktioner ovan.
    • +
    • Installera Scala-verktygen med detta långa terminalkommando på en och samma rad som slutar med ./cs setup:

      +
      curl -fL https://github.com/coursier/launchers/raw/master/cs-x86_64-apple-darwin.gz | gzip -d > cs && chmod +x cs && (xattr -d com.apple.quarantine cs || true) && ./cs setup
    • +
    • Starta om din dator.
    • +
    • Testa att skriva scala --version i ett nytt terminalfönster och om allt gått bra så ska du få en utskrift som börjar med "Scala code runner version 3".

-

Installera byggverktyget sbt

-

Installera Scala Build Tool sbt:

-
    -
  • Linux/Ubuntu/WSL/MacOS: +

    För dig som helst använder SDKMAN

    +

    https://sdkman.io/ är ett populärt installationsverktyg för att enkelt installera och hantera olika versioner av allehanda programmeringsverktyg för Linux/WSL/MacOS/GitBash/Cygwin. För dig som hellre vill använda SDKMAN i stället så går det utmärkt att installera allt ovan med hjälp av nedan kommando (om du har installerat SDKMAN):

    +
    sdk install java 17.0.4-tem
    +sdk install scala
    +sdk install scalacli
    +sdk install sbt
    +

    Tips: Det är viktigt att du noterar hur du har installerat olika grejer på din dator, speciellt om du blandar olika metoder. Om du behöver uppdatera eller avinstallera så blir det lätt förvirring om du glömt hur du installerat och försöker uppdatera/avinstallera med annan metod än du installerat etc.

    +

    Installera kod-editorn VS Code och tillägget Scala Metals

    +
      +
    1. Installera VS Code för ditt system här: https://code.visualstudio.com/Download
    2. +
    3. Installera tillägget Scala Metals. Du kan antingen göra detta via tilläggshanterare (Extensions) inne i VS Code eller via terminalen.
        -
      • Installera sdkman om du inte redan gjort det (se ovan).
      • -
      • Installera genom att skriva detta kommando i terminalen: sdk install sbt
      • -
      • Starta ett nytt terminalfönster och testa att skriva sbt -version och om allt gått bra ska du efter ett tag få en utskrift som börjar med "sbt version".
      • +
      • Inifrån VS Code: Tryck Ctrl+Shift+X och skriv i sök-rutan: Scala Metals, markera tillägget Scala (Metals) och klicka Install.
      • +
      • I terminalen skriv: code --install-extension scalameta.metals --force
    4. -
    5. Windows: Ladda ner och kör https://github.com/sbt/sbt/releases/download/v1.5.5/sbt-1.5.5.msi
    6. -
-

Läs mer om hur du använder sbt i Appendix i kompendiet.

+ +

Läs mer om vad du kan göra med en kodeditor i appendix i kompendiet

+

Installera Kojo

+

Vi använder Kojo på första labben. Kojo är utvecklat speciellt för att hjälpa elever i grundskola och gymnasium att lära sig programmera. Kojo används på Vattenhallen Science Center.

+

Det finns 3 olika sätt att köra Kojo:

+
    +
  1. Använd kodbiblioteket kojolib (rekommenderas), som fungerar fint med nya Scala 3. Ladda ner filen https://fileadmin.cs.lth.se/kojolib.scala och kör enl. instruktioner i kompendiet, t.ex. med scala-cli repl .

  2. +
  3. Kojo Desktop: en nybörjarvänlig utvecklingsmiljö med lättanvänd editor. Använder gamla Scala 2. Följ installationsinstruktioner för ditt system här: http://www.kogics.net/kojo-download

  4. +
  5. Kör Kojo i din webbläsare. Använder gamla Scala 2 och en begränsad uppsättning av de kommandon som finns i Kojo Desktop. Skriv och kör din kod direkt här: http://kojo.lu.se/

  6. +
+

LTH-studenter med programmeringskunskaper och intresse för pedagogik är välkomna att ansöka om att bli programmeringshandledare i Vattenhallen här: https://www.vattenhallen.lu.se/om-oss/kontakt/vh-student/student-intresseanmalan/

Hårdvara

Vid undervisning på campus rekommenderas LTH:s Linux-datorer. Ta gärna med ett eget tangentbord och en egen mus och koppla in i skolans datorer så minskar du smittrisken.

-

När du studerar hemma behöver du en bra arbetsplats och en dator med Linux (t.ex. Ubuntu 20.04), Windows 10 eller Mac. Det är bra att ha en ergonomisk kontorsstol vid ett bekvämt skrivbord, ett flyttbart tangentbord, en separat mus och en höj-och-sänkbar skärm.

+

När du studerar hemma behöver du en bra arbetsplats och en dator med Linux (t.ex. Ubuntu), Windows eller MacOS. Det är bra att ha en ergonomisk kontorsstol vid ett bekvämt skrivbord, ett flyttbart tangentbord, en separat mus och en höj-och-sänkbar skärm.

Köpa egen dator

-

När du ska programmera är det bra med en dator med minst 8GB RAM och 2.5GHz CPU. Du kan t.ex. köpa dator här: Compliq i Lund, Webbhallen i Malmö, Inet i Malmö

-

Både Lenovo och Dell har studentrabatt och säljer både stationära och bärbara datorer. De har även datorer med Linux förinstallerat.

+

När du ska programmera är det bra med en dator med minst 8GB RAM och 2.5GHz CPU. Du kan t.ex. köpa dator här: Compliq i Lund, Webbhallen i Malmö, Inet i Malmö

+

Både Lenovo och Dell har studentrabatt och säljer både stationära och bärbara datorer.

Om du letar efter en bra stationär dator rekommenderas senaste modellen av Siago som är fläktlös och därmed helt tyst. Sigao kan fås med Ubuntu eller Windows förinstallerat.

Headset-adapter

Vid distansundervisning är det bra med headset och webbkamera. Det går bra att koppla ditt eget headset till skolans datorer, t.ex. om du behöver prata med en handledare som jobbar hemifrån. Enklast är att använda ett USB-headset då kontakten sitter på framsidan. Om du har ett headset med 4-polig mobil-kontakt medan din dator har två 3-poliga kontakter för mic och hörlurar behövs en sådan här adapter:

diff --git a/web/tools/tools.md b/web/tools/tools.md index 8d270eacf..aa8d9b499 100644 --- a/web/tools/tools.md +++ b/web/tools/tools.md @@ -1,13 +1,13 @@ -I denna kurs använder vi programmeringsspråket **Scala** och exekveringsmiljön **OpenJDK**, samt byggverktyget `sbt` och editorn `vscode`. Läs om hur du använder dessa och andra programmeringsverktyg i **Appendix** i [kompendiet](https://cs.lth.se/pgk/compendium/). Verktygen finns förinstallerade på LTH:s [Linuxdatorer i E-huset](https://www.lth.se/lthin/datorsalar/vaara-datorsalar/e-huset/). Instruktioner om hur du installerar dessa verktyg på din egen dator finns i Appendix i kompendiet och nedan. +I denna kurs använder vi programmeringsspråket **Scala** och olika programmeringsverktyg. Läs om hur du använder dessa programmeringsverktyg i **Appendix** i [kompendiet](https://cs.lth.se/pgk/compendium/). Verktygen finns förinstallerade på LTH:s [Linuxdatorer i E-huset](https://www.lth.se/lthin/datorsalar/vaara-datorsalar/e-huset/). Instruktioner om hur du installerar dessa verktyg på din egen dator finns nedan. ## Programmera på LTH:s datorer På LTH:s [Linuxdatorer i E-huset](https://www.lth.se/lthin/datorsalar/vaara-datorsalar/e-huset/) finns alla de verktyg vi använder i kursen förinstallerade: -* Rekommenderad kodeditor: VS Code startas med kommandot `code` -* Scala REPL; kommando: `scala` +* Rekommenderad kodeditor: VS Code startas med kommandot `code` men innan du kör VS Code *första* gången: installera Scala-tillägg för VS Code med detta terminalkommando: `code --install-extension scalameta.metals --force` +* Scala REPL; kommando: `scala` eller `scala-cli repl .` * Utvecklingsmiljön Kojo; kommando: `kojo` -* Scala-kompilatorn; kommando: `scalac` +* Scala-kompilatorn; kommando: `scalac` eller `scala-cli compile .` * Byggverktyget sbt; kommando: `sbt` * Java-kompilatorn; kommando: `javac` * Exekveringsmijlön JVM med tillhörande utvecklingsbibliotek (OpenJDK); kommando: `java` @@ -16,28 +16,9 @@ På LTH:s [Linuxdatorer i E-huset](https://www.lth.se/lthin/datorsalar/vaara-dat ## Programmera på din egen dator -Du behöver följande verktyg på din egen dator: Kojo, OpenJDK, sbt, VS Code med tillägget Scala (Metals). Läs om dessa i Appendix i [kompendiet](https://cs.lth.se/pgk/compendium/) och följ instruktionerna nedan om hur du installerar verktygen på din egen dator. - - -### Installera Kojo - -Följ instruktioner här: [http://www.kogics.net/kojo-download](http://www.kogics.net/kojo-download) - -Vi använder utvecklingsmiljön Kojo på första labben. Kojo är utvecklat speciellt för att hjälpa elever i grundskola och gymnasium att lära sig programmera. Kojo används på [Vattenhallen Science Center](https://www.vattenhallen.lu.se/upplevelser/programmering/). - -LTH-studenter med programmeringskunskaper och intresse för pedagogik är välkomna att ansöka om att bli programmeringshandledare i Vattenhallen här: [https://www.vattenhallen.lu.se/om-oss/kontakt/vh-student/student-intresseanmalan/](https://www.vattenhallen.lu.se/om-oss/kontakt/vh-student/student-intresseanmalan/) - - -### Installera kodeditor - -* [**VS Code**](https://code.visualstudio.com/): rekommenderas i kursen, öppen källkod, alla plattformar. Installera tillägget **Scala Metals** via editorns tilläggshanterare (Extensions Ctrl+Shift+X), skriv i sök-rutan: *Metals* - -* [Atom](https://atom.io/): öppen källkod, alla plattformar, paketet Scala Metals finns att installera i editorns tilläggshanterare. - -* [Sublime Text](http://www.sublimetext.com/): stängd källkod, alla plattformar, paketet Scala Metals finns att installera i editorns tilläggshanterare. - -Läs mer om vad du kan göra med en kodeditor i appendix i [kompendiet](https://cs.lth.se/pgk/compendium/) +Du behöver installera detta på din egen dator: OpenJDK, Scala, och VS Code med tillägget Scala (Metals). Läs mer om dessa verktyg i Appendix i [kompendiet](https://cs.lth.se/pgk/compendium/) och följ instruktionerna nedan om hur du installerar verktygen på din egen dator. +(Om du redan använder SDKMAN och vill fortsätta med det så läs längre ner under "För dig som helst använder SDKMAN".) ### Starta terminalfönster @@ -47,99 +28,117 @@ Många av de programmeringsverktyg vi använder körs via ett terminalfönster. * **Windows**: * För Windows rekommenderas Microsoft-appen "Windows Terminal", se vidare här: [https://docs.microsoft.com/en-us/windows/terminal/get-started](https://docs.microsoft.com/en-us/windows/terminal/get-started) - * Om du har en uppdaterad version av **Windows 10** och en någorlunda modern dator så rekommenderas **WSL2** som ger dig tillgång till Linux/Ubuntu direkt under Windows, följ instruktioner här och välj Ubuntu 20.04 (fråga ngn om hjälp om du kör fast): [https://docs.microsoft.com/en-us/windows/wsl/install-win10](https://docs.microsoft.com/en-us/windows/wsl/install-win10) - * Du kan också köra den befintliga cmd-terminalen som inte kräver någon installation, följ instruktioner här [https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/](https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/) + * Du kan också köra den befintliga men antika cmd-terminalen direkt i Windows som inte kräver någon installation, följ instruktioner här [https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/](https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/) och läs mer om vilka kommando som finns i cmd här: [https://ss64.com/nt/](https://ss64.com/nt/) + * Om du har en uppdaterad version av Windows 10 eller 11 så rekommenderas också **WSL**, helst version 2, som ger dig tillgång till Linux/Ubuntu direkt under Windows i ett separat filsystem. För att installera WSL behöver du starta **PowerShell** med admin-rättigheter så här: tryck på windows-knappen, skriv `powershell` och högerklicka och välj run as administrator. Följ vidare instruktioner här och välj att installera Ubuntu 22.04 (fråga ngn om hjälp om du kör fast): [https://docs.microsoft.com/en-us/windows/wsl/install-win10](https://docs.microsoft.com/en-us/windows/wsl/install-win10) När du installerat WSL följ instruktionerna under **Linux-rubrikerna** nedan för att installera kursens programmeringsverktyg under WSL/Ubuntu. + * Det finns även andra sätt att installera Linux/Ubuntu, t.ex. med [VirtualBox](https://ubuntu.com/tutorials/how-to-run-ubuntu-desktop-on-a-virtual-machine-using-virtualbox#1-overview) (kräver snabb dator och rejät med RAM) eller [Dual Boot](https://medium.com/linuxforeveryone/how-to-install-ubuntu-20-04-and-dual-boot-alongside-windows-10-323a85271a73) (kräver att du har minst 25GB extra utrymme på disken, gärna mer, och att du krymper din Windows-partition och slår på legacy boot i BIOS), eller att du helt [ersätter Windows med Ubuntu](https://ubuntu.com/tutorials/install-ubuntu-desktop) (enklaste sättet och funkar fint även på äldre och klenare datorer). Fråga någon medstudent som vet hur det går till om råd och hjälp om du vill installera Ubuntu "på riktigt". * **Mac**: Följ instruktioner här: [https://www.howtogeek.com/682770/how-to-open-the-terminal-on-a-mac/](https://www.howtogeek.com/682770/how-to-open-the-terminal-on-a-mac/) -### Installera Java Development Kit (JDK) -**Kontrollera om du redan har JDK: ** +### Installera Java Development Kit (OpenJDK) + Du kanske redan har JDK installerat. Kontrollera detta genom att i ett terminalfönster skriva (observera avslutande c:et): ``` -javac -version +javac --version ``` -Version 11 rekommenderas, men andra versioner kan ev. också fungera. Om utskriften säger att `javac` saknas, installera då OpenJDK enl. nedan. +Om utskriften säger att `javac` saknas eller anger en annan version än version 17 eller 11, installera då OpenJDK enl. nedan. + +**Installera OpenJDK:** Läs även instruktionerna i appendix i [kompendiet](https://cs.lth.se/pgk/compendium/) innan du sätter igång. -**Installera OpenJDK: ** Läs även instruktionerna i appendix i [kompendiet](https://cs.lth.se/pgk/compendium/) innan du sätter igång. +* Linux/Ubuntu/WSL: Öppna terminalfönster och kör: +``` +sudo apt install openjdk-17-jdk openjdk-17-source +``` -* Windows/Mac: Installera OpenJDK här [https://adoptopenjdk.net/](https://adoptopenjdk.net/) +* Windows/Mac: Installera OpenJDK för ditt system härifrån: [https://adoptium.net/](https://adoptium.net/) - 1. Välj att ladda ner OpenJDK **version 11** (LTS) HotSpot **för ditt operativsystem**. - 2. I hämtade filer dubbelklicka för installation med förifyllda val. + 1. Välj att ladda ner OpenJDK **version 17** (LTS) HotSpot **för ditt operativsystem**. + 2. Dubbelklicka på filen som laddas ned för att starta installationen. Om du får en varning ska du köra ändå genom att klicka på "Mer information" eller liknande. Under installationen välj alla dessa åtgärder: Update PATH, Associate .jar, Set JAVA_HOME, JavaSoft registry key. 3. Starta om din dator. - 4. Starta terminalfönster och kontrollera enligt ovan att `javac` och `java` ger rätt version. - * Om något krånglar: fråga någon som installerat JDK förr om hjälp. - -* Linux/Ubuntu/WSL: Öppna terminalfönster och kör: - `sudo apt install openjdk-11-jdk` + 4. Starta terminalfönster och kontrollera att `javac --version` ger rätt version. Om något krånglar: fråga någon som installerat JDK förr om hjälp. +### Installera Scala med tillhörande verktyg -### Gör `scala` och `scalac` tillgängligt i terminalen +Scala med tillhörande verktyg installeras enklast med hjälp av det officiella installationsverktyget Coursier enligt nedan. Du får då bl.a. följande terminalverktyg som du kan läsa om i kompendiet: `scala`, `scalac`, `scala-cli`, `scaladoc`, `sbt`. -* **Linux/Ubuntu/WSL/MacOS**: Scala installeras lättast med **sdkman**: - * Testa att nedladdningsprogrammet `curl` finns på ditt system genom att skriva `curl --version` i terminalen. Om `curl` saknas så installera detta i terminalen genom att skriva: - ``` - sudo apt install curl - ``` - * Om du inte redan gjort det, installera **sdkman** genom att öppna ett terminalfönster och kopiera och klistra in följande, en rad i taget: - ``` - curl -s "https://get.sdkman.io" | bash - source "$HOME/.sdkman/bin/sdkman-init.sh" +* **Linux/Ubuntu/WSL**: + * Installera OpenJDK enligt instruktioner ovan. + * Testa om nedladdningsprogrammet `curl` finns på ditt system genom att skriva `curl --version` i terminalen. Om `curl` saknas så installera detta i terminalen genom att skriva: `sudo apt install curl` + * Installera Scala-verktygen med detta långa terminalkommando på en och samma rad som slutar med `./cs setup`: ``` - * Installera Scala med kommandot `sdk` så här: + curl -fL https://github.com/coursier/launchers/raw/master/cs-x86_64-pc-linux.gz | gzip -d > cs && chmod +x cs && ./cs setup ``` - sdk install scala - ``` - * Starta ett *nytt* terminalfönster och testa att skriva `scala -version` och om allt gått bra ska du få en utskrift som börjar med "Scala compiler version". + * Starta om din dator. + * Testa att skriva `scala --version` i ett nytt terminalfönster och om allt gått bra så ska du få en utskrift som börjar med "Scala code runner version 3". -* **Windows**: För att ladda ner och installera Scala så att `scalac` och `scala` blir tillgängligt i terminalen i Windows, gör så här: +* **Windows**: * Installera OpenJDK enligt instruktioner ovan. - * Ladda ned filen install-scala.bat via länken [https://cs.lth.se/pgk/scala-windows](https://cs.lth.se/pgk/scala-windows) och spara den t.ex. i Downloads och dubbel-klicka på den. Ett terminalfönster öppnas och kör igång nedladdning och uppdatering av path. När den är klar är det bara att starta en ny terminal och köra `scala`. - * För att installera en specifik version av scala så kan man i terminalen ge versionsnummer som argument, t.ex: - ``` - install-scala.bat 3.1.0-RC1 - ``` - * Om du har tillräckligt ny Windows-maskin rekommenderas även WSL (se ovan under "Starta terminalfönster") som gör att du kan köra Linux/Ubuntu under Windows och då installera ovan verktyg enligt instruktioner för Linux. - * Det finns också några lovande alternativ under utveckling som ska göra det ännu enklare att komma igång med Scala, där `scala-cli` rekommenderas: - * `scala-cli` är ett nytt program som enkelt och smidigt kan kompilera och göra igång scala-program och REPL. Installera [msi-filen som är specifik för Windows](https://github.com/VirtuslabRnD/scala-cli/releases/download/nightly/scala-cli-x86_64-pc-win32.msi) och läs mer om hur man använder `scala-cli` i terminalen här: [https://virtuslabrnd.github.io/scala-cli/](https://virtuslabrnd.github.io/scala-cli/) - * [Coursier](https://get-coursier.io/docs/cli-installation#windows) är ett avancerat system för installation och nedladdning som i sin tur kan installera kommandot `scala3-compiler` och `scala3-repl`. Kompilerade program måste tyvärr i skrivande stund köras direkt med `java`-kommandot, se längre ned i detta ärende: [https://github.com/coursier/coursier/issues/2058](https://github.com/coursier/coursier/issues/2058) + * Ladda ned filen [`cs-x86_64-pc-win32.zip`](https://github.com/coursier/launchers/raw/master/cs-x86_64-pc-win32.zip) och spara den på valfritt ställe och dubbel-klicka på den när nedladdningen är klar. Följ instruktionerna och svara jakande. Om du får varningar så kör ändå genom att klicka "Mer information" eller liknande. + * Starta om din dator. + * Testa att skriva `scala --version` i ett nytt terminalfönster och om allt gått bra så ska du få en utskrift som börjar med "Scala code runner version 3". + * Om du har en tillräckligt ny Windows-maskin rekommenderas även WSL (se ovan under "Starta terminalfönster") som gör att du kan köra Linux/Ubuntu under Windows och då installera Scala-verktyg enligt instruktioner för Linux. +* **MacOS**: + * Installera OpenJDK enligt instruktioner ovan. + * Installera Scala-verktygen med detta långa terminalkommando på en och samma rad som slutar med `./cs setup`: + ``` + curl -fL https://github.com/coursier/launchers/raw/master/cs-x86_64-apple-darwin.gz | gzip -d > cs && chmod +x cs && (xattr -d com.apple.quarantine cs || true) && ./cs setup + ``` + * Starta om din dator. + * Testa att skriva `scala --version` i ett nytt terminalfönster och om allt gått bra så ska du få en utskrift som börjar med "Scala code runner version 3". -### Installera byggverktyget `sbt` +### För dig som helst använder SDKMAN -Installera Scala Build Tool `sbt`: +[https://sdkman.io/](https://sdkman.io/) är ett populärt installationsverktyg för att enkelt installera och hantera olika versioner av allehanda programmeringsverktyg för Linux/WSL/MacOS/GitBash/Cygwin. För dig som hellre vill använda SDKMAN i stället så går det utmärkt att installera allt ovan med hjälp av nedan kommando (om du har [installerat SDKMAN](https://sdkman.io/install)): +``` +sdk install java 17.0.4-tem +sdk install scala +sdk install scalacli +sdk install sbt +``` +*Tips:* Det är viktigt att du noterar hur du har installerat olika grejer på din dator, speciellt om du blandar olika metoder. Om du behöver uppdatera eller avinstallera så blir det lätt förvirring om du glömt hur du installerat och försöker uppdatera/avinstallera med annan metod än du installerat etc. -* **Linux/Ubuntu/WSL/MacOS**: - * Installera **sdkman** om du inte redan gjort det (se ovan). - * Installera genom att skriva detta kommando i terminalen: - ``` - sdk install sbt - ``` - * Starta ett *nytt* terminalfönster och testa att skriva `sbt -version` och om allt gått bra ska du efter ett tag få en utskrift som börjar med "sbt version". +### Installera kod-editorn VS Code och tillägget Scala Metals -* **Windows**: Ladda ner och kör [https://github.com/sbt/sbt/releases/download/v1.5.5/sbt-1.5.5.msi](https://github.com/sbt/sbt/releases/download/v1.5.5/sbt-1.5.5.msi) - * Innan du kör igång med sbt i en Windowsterminal är det bra att skriva `chcp 65001` för att särskilda tecken (t.ex. ÅÄÖ) ska fungera som de ska. +1. Installera **VS Code** för ditt system här: [https://code.visualstudio.com/Download](https://code.visualstudio.com/Download) +2. Installera tillägget **Scala Metals**. Du kan antingen göra detta via tilläggshanterare (Extensions) inne i VS Code eller via terminalen. + - Inifrån VS Code: Tryck Ctrl+Shift+X och skriv i sök-rutan: ` Scala Metals`, markera tillägget *Scala (Metals)* och klicka *Install*. + - I terminalen skriv: `code --install-extension scalameta.metals --force` -Läs mer om hur du använder `sbt` i Appendix i [kompendiet](https://cs.lth.se/pgk/compendium/). +Läs mer om vad du kan göra med en kodeditor i appendix i [kompendiet](https://cs.lth.se/pgk/compendium/) +### Installera Kojo + +Vi använder Kojo på första labben. Kojo är utvecklat speciellt för att hjälpa elever i grundskola och gymnasium att lära sig programmera. Kojo används på [Vattenhallen Science Center](https://www.vattenhallen.lu.se/upplevelser/programmering/). + + +Det finns 3 olika sätt att köra Kojo: + +1. Använd kodbiblioteket **kojolib** (rekommenderas), som fungerar fint med nya Scala 3. Ladda ner filen [https://fileadmin.cs.lth.se/kojolib.scala](https://fileadmin.cs.lth.se/kojolib.scala) och kör enl. instruktioner i kompendiet, t.ex. med `scala-cli repl .` + +2. Kojo Desktop: en nybörjarvänlig utvecklingsmiljö med lättanvänd editor. Använder gamla Scala 2. Följ installationsinstruktioner för ditt system här: [http://www.kogics.net/kojo-download](http://www.kogics.net/kojo-download) + +3. Kör Kojo i din webbläsare. Använder gamla Scala 2 och en begränsad uppsättning av de kommandon som finns i Kojo Desktop. Skriv och kör din kod direkt här: [http://kojo.lu.se/](http://kojo.lu.se/) + +LTH-studenter med programmeringskunskaper och intresse för pedagogik är välkomna att ansöka om att bli programmeringshandledare i Vattenhallen här: [https://www.vattenhallen.lu.se/om-oss/kontakt/vh-student/student-intresseanmalan/](https://www.vattenhallen.lu.se/om-oss/kontakt/vh-student/student-intresseanmalan/) + ## Hårdvara Vid undervisning på campus rekommenderas LTH:s [Linux-datorer](https://www.lth.se/lthin/datorsalar/vaara-datorsalar/e-huset/). Ta gärna med ett eget tangentbord och en egen mus och koppla in i skolans datorer så minskar du smittrisken. -När du studerar hemma behöver du en bra arbetsplats och en dator med Linux (t.ex. Ubuntu 20.04), Windows 10 eller Mac. Det är bra att ha en ergonomisk kontorsstol vid ett bekvämt skrivbord, ett flyttbart tangentbord, en separat mus och en höj-och-sänkbar skärm. +När du studerar hemma behöver du en bra arbetsplats och en dator med Linux (t.ex. Ubuntu), Windows eller MacOS. Det är bra att ha en ergonomisk kontorsstol vid ett bekvämt skrivbord, ett flyttbart tangentbord, en separat mus och en höj-och-sänkbar skärm. ### Köpa egen dator -När du ska programmera är det bra med en dator med minst 8GB RAM och 2.5GHz CPU. Du kan t.ex. köpa dator här: [Compliq i Lund](https://www.compliq.se/bygga-dator/), [Webbhallen i Malmö](https://www.webhallen.com/se/store/22-Malmo-Triangeln), [Inet i Malmö](https://www.inet.se/info/243/inet-malmo) +När du ska programmera är det bra med en dator med minst 8GB RAM och 2.5GHz CPU. Du kan t.ex. köpa dator här: [Compliq i Lund](https://www.compliq.se/bygga-dator/), [Webbhallen i Malmö](https://www.webhallen.com/se/store/30-Malmo-City), [Inet i Malmö](https://www.inet.se/info/243/inet-malmo) -Både [Lenovo](https://www.lenovo.com/se/sv/studentrabatt/) och [Dell](https://www.dell.com/sv-se/shop/dell-advantage/cp/students) har studentrabatt och säljer både stationära och bärbara datorer. De har även datorer med [Linux förinstallerat](https://news.itsfoss.com/best-linux-laptops-2021/). +Både [Lenovo](https://www.lenovo.com/se/sv/studentrabatt/) och [Dell](https://www.dell.com/sv-se/shop/dell-advantage/cp/students) har studentrabatt och säljer både stationära och bärbara datorer. Om du letar efter en bra stationär dator rekommenderas senaste modellen av [Siago](https://www.atlastsolutions.com/sigao/) som är fläktlös och därmed helt tyst. Sigao kan fås med Ubuntu eller Windows förinstallerat. diff --git a/workspace/build.sbt b/workspace/build.sbt index 86b94d9d8..f6aa773cd 100644 --- a/workspace/build.sbt +++ b/workspace/build.sbt @@ -5,7 +5,7 @@ import Keys._ lazy val commonSettings = Seq( organization := "se.lth.cs", version := "2021.0.2", - scalaVersion := "3.1.0", + scalaVersion := "3.1.2", scalacOptions := Seq("-unchecked", "-deprecation") ) @@ -27,7 +27,9 @@ lazy val introprog_scalalib = (project in file("introprog")). settings( name := IntroprogLibName, version := IntroprogLibVersion, - scalaVersion := "3.0.1", // stick to 3.0.1 for backward and forward compatibility + scalaVersion := "3.0.2", // stick to latest 3.0 for backward and forward compatibility + // when sbt 1.7 is released start using scalaOutputVersion + // https://scala-lang.org/blog/2022/04/12/scala-3.1.2-released.html scalacOptions ++= Seq("-encoding", "UTF-8"), Compile/doc/scalacOptions ++= Seq( // TODO why docs here? scala3? "-implicits", diff --git a/workspace/javatext/build.sbt b/workspace/javatext/build.sbt index 06ce8784a..4a3286d89 100644 --- a/workspace/javatext/build.sbt +++ b/workspace/javatext/build.sbt @@ -1,4 +1,4 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" scalacOptions := Seq("-unchecked", "-deprecation") Compile/doc/javacOptions ++= Seq( "-encoding", "UTF-8", diff --git a/workspace/javatext/project/build.properties b/workspace/javatext/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/javatext/project/build.properties +++ b/workspace/javatext/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/project/build.properties b/workspace/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/project/build.properties +++ b/workspace/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w01_kojo/kojo.scala b/workspace/w01_kojo/kojo.scala new file mode 100644 index 000000000..e3732036d --- /dev/null +++ b/workspace/w01_kojo/kojo.scala @@ -0,0 +1,5 @@ +//> using scala "3" +//> using lib "net.kogics:kojo-lib:0.1.1,url=https://github.com/lunduniversity/introprog/releases/download/kojo-lib-0.1.1/kojo-lib-0.1.1.jar" + +export net.kogics.kojo.Swedish.*, padda.*, CanvasAPI.*, TurtleAPI.* +export builtins.{TurtleAPI as _, CanvasAPI as _, *} diff --git a/workspace/w03_irritext/build.sbt b/workspace/w03_irritext/build.sbt index 7f022de92..b704544b3 100644 --- a/workspace/w03_irritext/build.sbt +++ b/workspace/w03_irritext/build.sbt @@ -1 +1 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" diff --git a/workspace/w03_irritext/project/build.properties b/workspace/w03_irritext/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w03_irritext/project/build.properties +++ b/workspace/w03_irritext/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w04_blockmole/README.md b/workspace/w04_blockmole/README.md index 2be2cab48..6d3b471b5 100644 --- a/workspace/w04_blockmole/README.md +++ b/workspace/w04_blockmole/README.md @@ -20,7 +20,7 @@ Om du kör i Windows Powershell eller Cmd byt kolon mot semikolon i kommandona o Du kan också använda `sbt` som beskrivs i Appendix "Byggverktyg" i kompendiet. Lägg då jar-filen i en underkatalog kallad `lib` *eller* låt `sbt` automatiskt ladda ner biblioteket från Sonatype Maven Central genom att använda följande text i en fil `build.sbt`: - scalaVersion := "3.1.0" + scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" Se vidare dokumentationen för `introprog` här: http://fileadmin.cs.lth.se/pgk/api/ diff --git a/workspace/w04_blockmole/build.sbt b/workspace/w04_blockmole/build.sbt index b2b0f6940..d54d0b082 100644 --- a/workspace/w04_blockmole/build.sbt +++ b/workspace/w04_blockmole/build.sbt @@ -1,4 +1,4 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" diff --git a/workspace/w04_blockmole/project/build.properties b/workspace/w04_blockmole/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w04_blockmole/project/build.properties +++ b/workspace/w04_blockmole/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w06_blockbattle/Game.scala b/workspace/w06_blockbattle/Game.scala index 7171be2c3..98f90166e 100644 --- a/workspace/w06_blockbattle/Game.scala +++ b/workspace/w06_blockbattle/Game.scala @@ -14,7 +14,7 @@ class Game( val leftPlayerName: String = "LEFT", val rightPlayerName: String = "RIGHT" ): - import Game._ // direkt tillgång till namn på medlemmar i kompanjon + import Game.* // direkt tillgång till namn på medlemmar i kompanjon val window = new BlockWindow(windowSize, windowTitle, blockSize) val leftMole: Mole = ??? diff --git a/workspace/w06_blockbattle/build.sbt b/workspace/w06_blockbattle/build.sbt index 56efe36b7..4c9e306e0 100644 --- a/workspace/w06_blockbattle/build.sbt +++ b/workspace/w06_blockbattle/build.sbt @@ -1,3 +1,3 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" diff --git a/workspace/w06_blockbattle/project/build.properties b/workspace/w06_blockbattle/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w06_blockbattle/project/build.properties +++ b/workspace/w06_blockbattle/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w07_shuffle/build.sbt b/workspace/w07_shuffle/build.sbt index c0d4c4f59..533de7e4d 100644 --- a/workspace/w07_shuffle/build.sbt +++ b/workspace/w07_shuffle/build.sbt @@ -1 +1 @@ -scalaVersion := "3.1.0" +scalaVersion := "3.1.2" diff --git a/workspace/w07_shuffle/project/build.properties b/workspace/w07_shuffle/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w07_shuffle/project/build.properties +++ b/workspace/w07_shuffle/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w08_life/build.sbt b/workspace/w08_life/build.sbt index 56efe36b7..4c9e306e0 100644 --- a/workspace/w08_life/build.sbt +++ b/workspace/w08_life/build.sbt @@ -1,3 +1,3 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" diff --git a/workspace/w08_life/project/build.properties b/workspace/w08_life/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w08_life/project/build.properties +++ b/workspace/w08_life/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w08_life/src/main/scala/life/LifeWindow.scala b/workspace/w08_life/src/main/scala/life/LifeWindow.scala index 2305179ba..71bebdc0d 100644 --- a/workspace/w08_life/src/main/scala/life/LifeWindow.scala +++ b/workspace/w08_life/src/main/scala/life/LifeWindow.scala @@ -9,7 +9,7 @@ object LifeWindow: // lägg till fler användbara konstanter här tex färger etc. class LifeWindow(rows: Int, cols: Int): - import LifeWindow._ // importera namn från kompanjon + import LifeWindow.* // importera namn från kompanjon var life = Life.empty(rows, cols) val window: PixelWindow = ??? diff --git a/workspace/w09_words/build.sbt b/workspace/w09_words/build.sbt index 8d62a0490..14ff6199b 100644 --- a/workspace/w09_words/build.sbt +++ b/workspace/w09_words/build.sbt @@ -1,3 +1,3 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" \ No newline at end of file diff --git a/workspace/w09_words/project/build.properties b/workspace/w09_words/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w09_words/project/build.properties +++ b/workspace/w09_words/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w10_snake/build.sbt b/workspace/w10_snake/build.sbt index 07c651f64..26392fab5 100644 --- a/workspace/w10_snake/build.sbt +++ b/workspace/w10_snake/build.sbt @@ -1,4 +1,4 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" diff --git a/workspace/w10_snake/project/build.properties b/workspace/w10_snake/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w10_snake/project/build.properties +++ b/workspace/w10_snake/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w13_bank_proj/build.sbt b/workspace/w13_bank_proj/build.sbt index 7f022de92..b704544b3 100644 --- a/workspace/w13_bank_proj/build.sbt +++ b/workspace/w13_bank_proj/build.sbt @@ -1 +1 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" diff --git a/workspace/w13_bank_proj/project/build.properties b/workspace/w13_bank_proj/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w13_bank_proj/project/build.properties +++ b/workspace/w13_bank_proj/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w13_bank_proj/src/main/scala/bank/Bank.scala b/workspace/w13_bank_proj/src/main/scala/bank/Bank.scala new file mode 100644 index 000000000..970726e0e --- /dev/null +++ b/workspace/w13_bank_proj/src/main/scala/bank/Bank.scala @@ -0,0 +1,50 @@ +package bank + +import time.Date + +/** + * A bank with no accounts and no history. + */ +class Bank(): + /** + * Returns a list of every bank account in the bank. + * The returned list is sorted in alphabetical order based + * on customer name. + */ + def allAccounts(): Vector[BankAccount] = ??? + + /** + * Returns the account holding the provided account number. + */ + def findByNumber(accountNbr: Int): Option[BankAccount] = ??? + + /** + * Returns a list of every account belonging to + * the customer with the provided id. + */ + def findAccountsForHolder(id: Long): Vector[BankAccount] = ??? + + /** + * Returns a list of all customers whose names match + * the provided name pattern. + */ + def findByName(namePattern: String): Vector[Customer] = ??? + + /** + * Executes an event in the bank. + * Returns a string describing whether the + * event was successful or failed. + */ + def doEvent(event: BankEvent): String = ??? + + /** + * Returns a log of all changes to the bank's state. + */ + def history(): Vector[HistoryEntry] = ??? + + /** + * Resets the bank to the state it had at the provided date. + * Returns a string describing whether the event was + * successful or failed. + */ + def returnToState(returnDate: Date): String = ??? \ No newline at end of file diff --git a/workspace/w13_bank_proj/src/main/scala/bank/BankAccount.scala b/workspace/w13_bank_proj/src/main/scala/bank/BankAccount.scala new file mode 100644 index 000000000..3d7780489 --- /dev/null +++ b/workspace/w13_bank_proj/src/main/scala/bank/BankAccount.scala @@ -0,0 +1,28 @@ +package bank + +/** + * A bank account for hold by a specific customer. + * The account is given a unique account number and initially + * has a balance of 0 kr. + */ +class BankAccount(val holder: Customer): + val accountNumber: Int = ??? + + /** + * Deposits the provided amount in this account. + */ + def deposit(amount: BigInt): Unit = ??? + + /** + * Returns the balance of this account. + */ + def balance: BigInt = ??? + + /** + * Withdraws the provided amount from this account, + * if there is enough money in the account. Returns true + * if the transaction was successful, otherwise false. + */ + def withdraw(amount: BigInt): Boolean = ??? + + override def toString(): String = ??? \ No newline at end of file diff --git a/workspace/w13_bank_proj/src/main/scala/bank/Customer.scala b/workspace/w13_bank_proj/src/main/scala/bank/Customer.scala new file mode 100644 index 000000000..5249a3bfa --- /dev/null +++ b/workspace/w13_bank_proj/src/main/scala/bank/Customer.scala @@ -0,0 +1,7 @@ +package bank + +/** + * A customer of a bank with provided name and id. + */ +case class Customer(name: String, id: Long): + override def toString(): String = ??? \ No newline at end of file diff --git a/workspace/w13_img_proj/build.sbt b/workspace/w13_img_proj/build.sbt index b416f83f4..1b201c8ab 100644 --- a/workspace/w13_img_proj/build.sbt +++ b/workspace/w13_img_proj/build.sbt @@ -1,4 +1,4 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" scalacOptions := Seq("-unchecked", "-deprecation") diff --git a/workspace/w13_img_proj/project/build.properties b/workspace/w13_img_proj/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w13_img_proj/project/build.properties +++ b/workspace/w13_img_proj/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w13_music_proj/build.sbt b/workspace/w13_music_proj/build.sbt index 1271627b4..be1901f87 100644 --- a/workspace/w13_music_proj/build.sbt +++ b/workspace/w13_music_proj/build.sbt @@ -1,4 +1,4 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" fork := true // https://stackoverflow.com/questions/18676712 connectInput := true // http://www.scala-sbt.org/1.x/docs/Forking.html outputStrategy := Some(StdoutOutput) diff --git a/workspace/w13_music_proj/project/build.properties b/workspace/w13_music_proj/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w13_music_proj/project/build.properties +++ b/workspace/w13_music_proj/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2 diff --git a/workspace/w13_photo/build.sbt b/workspace/w13_photo/build.sbt index e32aa20c2..b3a141970 100644 --- a/workspace/w13_photo/build.sbt +++ b/workspace/w13_photo/build.sbt @@ -1,2 +1,2 @@ -scalaVersion := "3.1.0" +scalaVersion := "3.1.2" libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1" diff --git a/workspace/w13_tabular/build.sbt b/workspace/w13_tabular/build.sbt index c2308f0a2..1b2f489c2 100644 --- a/workspace/w13_tabular/build.sbt +++ b/workspace/w13_tabular/build.sbt @@ -1,4 +1,4 @@ -ThisBuild/scalaVersion := "3.1.0" +ThisBuild/scalaVersion := "3.1.2" fork := true // https://stackoverflow.com/questions/18676712 connectInput := true // http://www.scala-sbt.org/1.x/docs/Forking.html outputStrategy := Some(StdoutOutput) diff --git a/workspace/w13_tabular/project/build.properties b/workspace/w13_tabular/project/build.properties index 10fd9eee0..c8fcab543 100644 --- a/workspace/w13_tabular/project/build.properties +++ b/workspace/w13_tabular/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.6.2