45 lines
2.3 KiB
Org Mode
45 lines
2.3 KiB
Org Mode
#+OPTIONS: toc:nil author:nil
|
|
#+TITLE: The L₃ compiler
|
|
|
|
* Introduction
|
|
|
|
This directory contains the source code of the L₃ compiler, written in Scala. All interactions with the compiler should be done through [[http://www.scala-sbt.org/][sbt]], a Scala build tool.
|
|
|
|
~Sbt~ can either be run in interactive mode, by simply typing ~sbt~ and then entering commands at the prompt, or in batch mode. The following sections use batch mode for illustration, but in practice interactive mode is often to be preferred as it avoids repeated startup of ~sbt~ itself.
|
|
|
|
* Compiling
|
|
|
|
To compile the compiler, use the ~compile~ command:
|
|
: $ sbt compile
|
|
(the dollar sign ~$~ represents the shell prompt and should not be typed).
|
|
|
|
* Testing
|
|
|
|
To test the compiler (and compile it beforehand, if necessary), use the ~test~ command:
|
|
: $ sbt test
|
|
|
|
* Running
|
|
|
|
To run the compiler (and compile it beforehand, if necessary), use the ~run~ command, followed by arguments for the compiler, e.g.:
|
|
: $ sbt 'run ../library/lib.l3m ../examples/queens.l3'
|
|
|
|
The compiler accepts a list of files to compile as arguments. These files can have one of the following extensions:
|
|
|
|
- ~.l3~ :: A normal source file, containing L₃ code.
|
|
|
|
- ~.l3m~ :: A module file, containing a list of other files, which must also be either source files (with a ~.l3~ extension) or other module files (with a ~.l3m~ extension).
|
|
|
|
Modules are expanded recursively, until only ~.l3~ files remain. Then, duplicate file names are removed, with only the first occurrence kept. Finally, this list of files is fed to the compiler.
|
|
|
|
As an example, assume that the file ~lib.l3m~ references ~characters.l3m~ and ~integers.l3m~, and that ~characters.l3m~ references ~characters.l3~ while ~integers.l3m~ references both ~characters.l3m~ and ~integers.l3~. Then, a command line consisting of ~lib.l3m~ and ~helloworld.l3~ is expanded as follows:
|
|
|
|
1. ~lib.l3m~ ~helloworld.l3~ (original command line),
|
|
|
|
2. ~characters.l3m~ ~integers.l3m~ ~helloworld.l3~ (expansion of ~lib.l3m~),
|
|
|
|
3. ~characters.l3~ ~characters.l3m~ ~integers.l3~ ~helloworld.l3~ (expansion of ~characters.l3m~ and ~integers.l3m~),
|
|
|
|
4. ~characters.l3~ ~characters.l3~ ~integers.l3~ ~helloworld.l3~ (expansion of the second ~characters.l3m~),
|
|
|
|
5. ~characters.l3~ ~integers.l3~ ~helloworld.l3~ (removal of duplicates).
|