The goal of this first assignment is to familiarise yourself with the minischeme language and its implementation. To start, download the archive and uncompress it in your working directory. Then, run make to build the compiler, interpreter and virtual machine. Notice that this requires scala v2.6.1, a recent version of gcc and Gnu make.

Part 1: the tool chain

The minischeme tool chain is composed of three tools: an interpreter for the minischeme language (msi), a compiler (msc) that produces code for the minivm virtual machine, and the virtual machine itself (vm). To get familiar with these tools, you will first write and run a simple "hello, world" program. In minischeme, this program looks as follows:

        (print-string "hello, world")

As you know, minischeme is equipped with a set of primitives. However, neither print-string nor newline are primitives. Instead, they are defined in the file libraries/predefined.scm. This file contains a set of predefined functions and values, and as such, it is meant to be included in all projects.

To test your "hello, world" program, save it in a file called hello.scm. Then, execute it using the interpreter, as follows:

        bin/msi libraries/predefined.scm hello.scm

If you get the expected output, the next step is to try with the compiler and virtual machine. For this, first compile your program as follows:

        bin/msc libraries/predefined.scm hello.scm -o hello.asm

Then, run the virtual machine on the resulting assembly file:

        bin/vm hello.asm

Part 2: the minischeme language

The file predefined.scm that you received is unfortunately incomplete: two important functions, print-int and read-int are missing. To familiarise yourself with the minischeme language, your next goal is to write them. Of course, they should be expressed in terms of the two primitives print-char and read-char. Make sure that they can handle negative integers too!

Once you have added these two functions to predefined.scm, write a small test program that reads two integers and displays the first elevated to the power of the second. You can assume that the exponent is not negative.

Part 3: the minischeme compiler

In order to familiarise yourself with the compiler, you will now add two constructs to the language: the logical and and the logical or.

The version of predefined.scm that you received contains definitions for two functions called and and or. While these functions do what they are supposed to do, they are not short-cutting. That is, their second argument is always evaluated, even when this is unnecessary.

The easiest way to ensure that these logical constructs are short-cutting is to treat them as syntactic sugar for if expressions. For example, here is the equivalence for and:

        (and e1 e2) = (if e1 e2 0)

Modify the compiler so that it performs these transformations, and then remove the definitions in predefined.scm. Then, write a test program that exhibits the short-cutting behaviour of these operators, and check that it works as expected, both with the interpreter and the virtual machine.

Tips and tricks

We urge you to use a good version control system to store your code, even when working alone. Moreover, we recommend using a system that is distributed, as this avoids the need for a centralised, always-reachable server. The most popular these days seem to be mercurial and git. Our personal favourite is darcs. Subversion is also popular, but centralised, and we therefore do not recommend it.