trilleplay/introprog-scalalib
Scala library with simple-to-use utilites for students of introductory programming. http://cs.lth.se/pgk/api
introprog-scalalib
This is a library with Scala utilities for Computer Science teaching. The library is maintained by Björn Regnell at Lund University, Sweden. Contributions are welcome!
-
The api documentation is available here: http://cs.lth.se/pgk/api/
-
You can find code examples here: src/main/scala/introprog/examples
This repo is used in this course (in Swedish): http://cs.lth.se/pgk with course material published as free open source here: https://github.com/lunduniversity/introprog
How to use introprog-scalalib
Using scala-cli
You need Scala Command Line Interface at least version 1.0.0.
Add these magic comment lines starting with //> in the beginning of your Scala 3 file:
//> using scala 3.3
//> using lib se.lth.cs::introprog:1.3.1
You run your code with scala-cli run . (note the ending dot, meaning "this dir")
If your program looks like this:
//> using scala 3.3
//> using lib se.lth.cs::introprog:1.3.1
@main def run =
val w = introprog.PixelWindow()
w.drawText("Hello introprog.PixelWindow!", x = 100, y = 100)
You should see green text in a new window after executing:
scala-cli run .
See: api documentation for PixelWindow
You can also give the introprog dependency directly at the command line, instead of the using lib directive:
scala-cli run . --dep se.lth.cs::introprog:1.3.1
Using sbt
You need Scala Build Tool at least version 1.5.2 (preferably 1.6.2 or later).
Put this text in a file called build.sbt
scalaVersion := "3.3.0"
libraryDependencies += "se.lth.cs" %% "introprog" % "1.3.1"
When you run sbt in terminal the introprog package is automatically downloaded and made available on your classpath.
You can do things like:
> sbt
sbt> console
scala> val w = new introprog.PixelWindow()
scala> w.fill(100,100,100,100,java.awt.Color.red)
See: api documentation for PixelWindow
Older Scala versions
If you want to use Scala 2.13 with 2.13.5 or later then use these special settings in build.sbt, esp. note that you should use version 1.1.5 of introprog:
scalaVersion := "2.13.8" //2.13.5 or any later 2.13 version
scalacOptions += "-Ytasty-reader"
libraryDependencies +=
("se.lth.cs" %% "introprog" % "1.1.5").cross(CrossVersion.for2_13Use3)
For Scala 2.12.x and 2.13.4 and older you need to use version 1.1.4 of introprog or older.
Manual download
Download the latest jar-file from here:
- Github releases: https://github.com/lunduniversity/introprog-scalalib/releases
- Scaladex: https://index.scala-lang.org/lunduniversity/introprog-scalalib
- Search Maven central: https://search.maven.org/search?q=introprog
- Maven central server: https://repo1.maven.org/maven2/se/lth/cs/
Put the latest introprog jar-file in your sbt project in a subfolder called lib. In your build.sbt you only need scalaVersion := "3.0.1" without a library dependency to introprog, as sbt automatically put jars in lib on your classpath.
How to build introprog-scalalib
With sbt and git on your path type in terminal:
> git clone git@github.com:lunduniversity/introprog-scalalib.git
> cd introprog-scalalib
> sbt package
Intentions and philosophy behind introprog-scalalib
This repo includes utilities to empower learners to advance from basic to intermediate levels of computer science by providing easy-to-use constructs for creating simple desktop apps in terminal and using simple 2D graphics. The utilities are implemented and exposed through an api that follows these guidelines:
- Use as simple constructs as possible.
- Follow Scala idioms with a pragmatic mix of imperative, functional and object-oriented programming.
- Don't use advanced functional programming concepts and magical implicits.
- Prefer a clean api with single-responsibility functions in simple modules.
- Prefer immutability over mutable state,
Vectorfor sequences and case classes for data. - Hide/avoid threading and complicated concurrency.
- Inspiration:
- Talk by Martin Odersky: Scala the Simple Parts with slides here
- Principle of least power blog post by Li Haoyi
Areas currently in scope of this library:
- Simple pixel-based 2D graphics for single-threaded game programming with explicit game loop.
- Simple blocking IO that hides the underlying complication of releasing resources etc.
- Simple modal GUI dialogs that block while waiting for user response.