Author: Tommi Höynälänmaa

# Theme-D Programming Language

## Introduction

Programming language Theme-D extends Scheme with static typing. The current Scheme platform is guile 2.2 but the software works for guile 2.0 and guile 3.0, too. Theme-D programs can also be compiled for Racket. Theme-D resembles Jaap Weel's Theme but Theme-D is more dynamic and the objects in Theme-D need to have type tags. See Theme-D-Gnome for GNOME bindings to Theme-D.

Some properties of Theme-D:

- Static type system
- A simple object system
- Multi-methods dispatched runtime (and also compile-time)
- Parametrized (type parameters) classes, types, and procedures
- Signature types resembling Java interfaces but multiply dispatched
- A module system
- Numerical tower
- Two kinds of variables: constants and mutable variables

## Hello, World!

Here is the implementation of "Hello World" in Theme-D:

          (define-proper-program hello-world

            (import (standard-library core)
                    (standard-library console-io))

            (define-simple-proc main (() <none> nonpure)
              (console-display-line "Hello, world!")))

## Support and discussion

See the Theme-D Sourceforge Forum .

## Documentation

- Theme-D Language Manual can be found at theme-d-language-manual-1.4.1.pdf
- Theme-D Standard Library Reference can be found at theme-d-standard-library-reference-1.4.1.pdf
- The user guide, including installation instructions, of the current Theme-D implementation can be found at theme-d-user-guide-1.4.1.pdf

## Example and test programs

The example and the test programs can be found in the Theme-D testing environment. See the Theme-D User Guide for instructions how to install it and build the programs. The programs can also be found in the Theme-D source code package .

## Downloading and installation

### Debian testing and unstable distributions and Ubuntu eoan

Give command

          sudo apt-get install theme-d-translator theme-d-rte theme-d-stdlib

If you also want to install the documentation give command

          sudo apt-get install theme-d-doc

too.

### Debian stable distribution and earlier Ubuntu distributions

If you are satisfied with an older version of Theme-D follow the instructions in the previous paragraph. Otherwise follow the instructions in the two following paragraphs. The second alternative is recommended.

### Other Debian-based systems with amd64/Intel 64-bit x86 processor architecture and Guile version 2.2

Get the following files:

- libthemedsupport_1.4.1-1_amd64.deb
- theme-d-translator_1.4.1-1_amd64.deb
- theme-d-rte_1.4.1-1_amd64.deb
- theme-d-stdlib_1.4.1-1_all.deb
- theme-d-doc_1.4.1-1_all.deb
- th-scheme-utilities_1.4.1-1_all.deb

and follow the instructions in the Theme-D User Guide in order to install the software. Source code can be obtained from theme-d-1.4.1.tar.gz and theme-d_1.4.1-1.debian.tar.xz . The `.dsc` file can be found here .

### Other Debian-based systems

Get theme-d-1.4.1.tar.gz and theme-d_1.4.1-1.debian.tar.xz and follow the instructions in the Theme-D User Guide in order to install the software.

### Other UNIX systems

Get theme-d-1.4.1.tar.gz and follow the instructions in the Theme-D User Guide in order to install the software.

### Racket support

Install Theme-D normally and install Racket package theme-d-racket.zip after that. See section 2.4 in the Theme-D User Guide for instructions.

## Downloading older versions

### Version 1.4.0

Get Theme-D version 1.4.0 . If you have a Debian-based system get Theme-D Debian files version 1.4.0-1 , too.

### Version 1.3.1

Get Theme-D version 1.3.1 . If you have a Debian-based system get Theme-D Debian files version 1.3.1-1 or Theme-D Debian files version 1.3.1-2 , too.

### Version 1.3.0-1

Get Theme-D version 1.3.0 . If you have a Debian-based system get Theme-D Debian files version 1.3.0-1 , too.

### Version 1.2.0-1

Get Theme-D version 1.2.0 . If you have a Debian-based system get Theme-D Debian files version 1.2.0-1 , too.

### Version 1.1.17-1

Get Theme-D version 1.1.17 . If you have a Debian-based system get Theme-D Debian files version 1.1.17-1 , too.

### Version 1.1.16-1

Get Theme-D version 1.1.16 . If you have a Debian-based system get Theme-D Debian files version 1.1.16-1 , too.

### Version 1.1.15-1

Get Theme-D version 1.1.15 . If you have a Debian-based system get Theme-D Debian files version 1.1.15-1 , too.

### Version 1.1.14-1

Get Theme-D version 1.1.14 . If you have a Debian-based system get Theme-D Debian files version 1.1.14-1 , too.

### Version 1.1.13-1

Get Theme-D version 1.1.13 . If you have a Debian-based system get Theme-D Debian files version 1.1.13-1 , too.

### Version 1.1.12-1

Get Theme-D version 1.1.12 . If you have a Debian-based system get Theme-D Debian files version 1.1.12-1 , too.

### Version 1.1.11-1

Get Theme-D version 1.1.11 . If you have a Debian-based system get Theme-D Debian files version 1.1.11-1 , too.

### Version 1.1.10-1

Get Theme-D version 1.1.10 . If you have a Debian-based system get Theme-D Debian files version 1.1.10-1 , too.

### Version 1.1.9-1

Get Theme-D version 1.1.9 . If you have a Debian-based system get Theme-D Debian files version 1.1.9-1 , too.

### Version 1.1.8-1

Get Theme-D version 1.1.8 . If you have a Debian-based system get Theme-D Debian files version 1.1.8-1 , too.

### Version 1.1.7-2

Get Theme-D version 1.1.7 . If you have a Debian-based system get Theme-D Debian files version 1.1.7-2 , too.

### Version 1.1.7-1

Get Theme-D version 1.1.7 . If you have a Debian-based system get Theme-D Debian files version 1.1.7-1 , too.

### Version 1.1.6-2

Get Theme-D version 1.1.6 . If you have a Debian-based system get Theme-D Debian files version 1.1.6-2 , too.

### Version 1.1.6-1

Get Theme-D version 1.1.6 . If you have a Debian-based system get Theme-D Debian files version 1.1.6-1 , too.

### Version 1.1.5

Get Theme-D version 1.1.5 , TH Scheme Utilities version 1.4.2 , and libthemedsupport version 1.1.1 .

### Version 1.1.4

Get Theme-D version 1.1.4 , TH Scheme Utilities version 1.4.1 , and libthemedsupport version 1.1.1 .

### Version 1.1.3

Get Theme-D version 1.1.3 , TH Scheme Utilities version 1.4.1 , and libthemedsupport version 1.1.1 .

### Version 1.1.2

Get Theme-D version 1.1.2 , TH Scheme Utilities version 1.4.1 , and libthemedsupport version 1.1 .

### Version 1.1.1

Get Theme-D version 1.1.1 , TH Scheme Utilities version 1.4.1 , and libthemedsupport version 1.1 .

### Version 1.1.0

Get Theme-D version 1.1.0 , TH Scheme Utilities version 1.4.1 , and libthemedsupport version 1.1 .

### Version 1.0.12

Get Theme-D version 1.0.12 , TH Scheme Utilities version 1.3 , and libthemedsupport version 1.0 .

### Version 1.0.11

Get Theme-D version 1.0.11 and TH Scheme Utilities version 1.3 .

### Version 1.0.10

Get Theme-D version 1.0.10 and TH Scheme Utilities version 1.3 .

### Version 1.0.9

Get Theme-D version 1.0.9 and TH Scheme Utilities version 1.3 .

### Version 1.0.8

Get Theme-D version 1.0.8 and TH Scheme Utilities version 1.3 .

### Version 1.0.7

Get Theme-D version 1.0.7 and TH Scheme Utilities version 1.3 .

### Version 1.0.6

Get Theme-D version 1.0.6 and TH Scheme Utilities version 1.3 .

### Version 1.0.5

Get Theme-D version 1.0.5 and TH Scheme Utilities version 1.3 .

### Version 1.0.4

Get Theme-D version 1.0.4 and TH Scheme Utilities version 1.3 .

### Version 1.0.3

Get Theme-D version 1.0.3 and TH Scheme Utilities version 1.3 .

### Version 1.0.2

Get Theme-D version 1.0.2 and TH Scheme Utilities version 1.3 .

### Version 1.0.1

Get Theme-D version 1.0.1 and TH Scheme Utilities version 1.3 .

### Version 1.0.0

Get Theme-D version 1.0.0 and TH Scheme Utilities version 1.3 .

### Version 0.9.10

Get Theme-D version 0.9.10 and TH Scheme Utilities version 1.2x .

### Version 0.9.9.1

Get Theme-D version 0.9.9.1 and TH Scheme Utilities version 1.2x .

### Version 0.9.9

Get Theme-D version 0.9.9 and TH Scheme Utilities version 1.2x .

### Version 0.9.8

Get Theme-D version 0.9.8 and TH Scheme Utilities version 1.2x .

### Version 0.9.7

Get Theme-D version 0.9.7 and TH Scheme Utilities version 1.2x .

### Version 0.9.6

Get Theme-D version 0.9.6 and TH Scheme Utilities version 1.2x .

### Version 0.9.5

Get Theme-D version 0.9.5 and TH Scheme Utilities version 1.2x .

### Version 0.9.4

Get Theme-D version 0.9.4 and TH Scheme Utilities version 1.2x .

### Version 0.9.3

Get Theme-D version 0.9.3 and TH Scheme Utilities version 1.2x .

### Version 0.9.2

Get Theme-D version 0.9.2 and TH Scheme Utilities version 1.2x .

### Version 0.9.1

Get Theme-D version 0.9.1 and TH Scheme Utilities version 1.1x .

### Version 0.9.0

Get Theme-D version 0.9.0 and TH Scheme Utilities version 1.1x .

### Version 0.8.12

Get Theme-D version 0.8.12 and TH Scheme Utilities version 1.0 .

### Version 0.8.11

Get Theme-D version 0.8.11 and TH Scheme Utilities version 1.0 .

### Version 0.8.10

Get Theme version 0.8.10 and TH Scheme Utilities version 1.0 .

### Version 0.8.9

Get Theme version 0.8.9 and TH Scheme Utilities version 1.0 .

### Version 0.8.8

Get Theme version 0.8.8 and TH Scheme Utilities version 1.0 .

### Version 0.8.7

Get Theme version 0.8.7 and TH Scheme Utilities version 1.0 .

### Version 0.8.6

Get Theme version 0.8.6 and TH Scheme Utilities version 1.0 .

### Version 0.8.5

- An old implementation of Theme can be found at theme-0.8.5.tar.bz2
- Some Scheme utilities needed by the Theme implementation v. 0.8.5 can be found at scheme-general-1.2.tar.bz2

## Version history

### Changes in the release 1.4.1

- Fixed a bug in the Standard Library Reference.
- Use the underlying Guile implementation for EOF objects.

### Changes in the release 1.4.0

- Moved `call/cc`, `exec/cc`, and `guard` to the standard library.
- Split the core module.
- Allow a nonreturning expression to be casted statically to any type.
- Optimized the internal representation of nonatomic constants.
- Fixed a bug with intermediate language `scheme-no-opt`.
- Done some cleaning with the source code.

### Changes in the release 1.3.1

- Corrected bugs with generic procedures.

### Changes in the release 1.3.0

- Support for Racket as the target platform.
- Fixed a bug with procedure `string-match`.
- Allow field names to overlap with variable names.
- New implementation for hash tables.
- Changed the runtime environment to use modules.
- Programs written in Theme-D can be run without the Theme-D configuration file.
- Renamed `a-list` to `alist` in the standard library.

### Changes in the release 1.2.0

- Fixed and redesigned text file I/O
- Fixed bugs with optimized equality predicates
- Changed the implementation of static methods
- Optimized predicate `equal?` for primitive types

### Changes in the release 1.1.17

- Fixed a bug with toplevel mutable variables
- Fixed procedure class macro expansion
- Fixed assertion error messages
- Renamed `<nil>` to `<null>` in the runtime environment

### Changes in the release 1.1.16

- Fixed bugs with generic procedure dispatch.
- Fixed module linkage order.
- Fixed a bug with constructors.
- Allowed list constants in interfaces.
- Implemented procedure call stack output for intermediate language Scheme.
- Removed vector constants from the core forms source code.

### Changes in the release 1.1.15

- Corrected a bug with let expressions.
- Corrected bugs with special procedure type dispatch.
- Improved some error messages.

### Changes in the release 1.1.14

- Changed Debian revision in the User Guide to a symbol.

### Changes in the release 1.1.13

- Corrected a bug with `match-type-strong`.

### Changes in the release 1.1.12

- Corrected bugs with Guile 2.2 Tree-IL.
- Install `custom1.scm` and `custom2.scm` instead of the `.go` files.

### Changes in the release 1.1.11

- Updated the documentation.

### Changes in the release 1.1.10

- Corrected a bug with custom primitive classes.
- Allowed logical types in mutable forward declarations.

### Changes in the release 1.1.9

- Updated the documentation.

### Changes in the release 1.1.8

- Updated the documentation.

### Changes in the release 1.1.7

- Changed the installation directories.
- Implemented script `get-theme-d-config-var`.
- Moved `doc/copyright` to `COPYING` and `doc/ChangeLog` to `ChangeLog`.

### Changes in the release 1.1.6

- Reorganized the code to be distributed in Debian.
- Improved some error messages.

### Changes in the release 1.1.5

- Added generic procedure `=` for testing numerical equality.
- Removed `equal?` predicates between different numerical classes.
- Changed exception handling in the standard library and the runtime environment.
- Added procedure `raw-exit` into the standard library.
- Prevent inheriting Theme-D classes from GOOPS classes.
- The program name is now the first command line argument.
- Corrected a bug in the difference between a diagonal matrix and a matrix.
- Changed the syntax of the `guard-general` form.
- Added correct output of the test programs.
- Optimized runtime GOOPS class handling.

### Changes in the release 1.1.4

- Corrected a bug with equality predicates and parametrized classes in the runtime environment.

### Changes in the release 1.1.3

- Corrected bugs with equality predicate optimization.
- Corrected a bug with reexporting macros.
- Corrected a bug with `type-loop`.
- Added procedures `member-values?` and `assoc-values` into the standard library.

The Theme-D support library Debian package is now built for Guile 2.0.

### Changes in the release 1.1.2

- Corrected a bug with line numbering in error messages.

### Changes in the release 1.1.1

- Corrected a bug with letrec.
- Updated `doc/theme-d-translator-types.pdf`.

### Changes in the release 1.1.0

- Support for both guile-2.2 and guile-2.0.
- Optimized procedures `is-integer?`, `is-real?`, `r-floor`, `r-truncate`, `r-floor`, and `r-ceiling`.
- Added procedure `factorial` to the core module.
- Compute exact values for `log2`, `log10`, `tgamma`, and `lgamma`.
- Prevent stripping of class `<scheme-condition>` in the core module.

### Changes in the release 1.0.12

- Implemented numeric tower and rational numbers in the standard library.
- Rewrote the generic math procedures.
- Optimized real math procedures.
- Implemented interface for many standard C and POSIX C math functions.
- Added dependency to library `libthemedsupport`.
- Corrected a bug in procedure `c-acos`.
- Implemented `equal?` as a generic procedure.
- Corrected a bug with definition of declared methods.
- Implemented bitwise arithmetic in the standard library.
- Added procedures `r-round`, `r-truncate`, `r-floor`, `r-ceiling`, `i-nonneg-expt`, `r-nonneg-int-expt`, `r-int-expt`, `gcd`, `i-sign`, `r-sign`, `make-numerical-overflow`, `raise-numerical-overflow`, `nan`, `inf`, and `neg-inf` into the core module.
- Optimized field references.
- Load custom files from compiled files instead of source files.

### Changes in the release 1.0.11

- Added a missing type check for definitions of declared variables.

### Changes in the release 1.0.10

- Corrected a bug with cloning singletons.
- Changed exception handling in i/o and math procedures.
- Corrected expression output in compiler error messages.
- Corrected line numbering in compiler error messages.
- Changed macro syntax violation messages.
- Check that `prelink-body` is not used in interfaces.
- Delete the target `.go` file if linker fails.
- Corrected a bug with `force-pure-expr`.
- Optimized `cast-x-vector` procedures in case the original element type is a subtype of the new element-type.
- Corrected a bug with opening output files in the translator.
- Added procedures `nan?`, `infinite?`, and `finite?` into the standard library.
- Added procedures `hash-exists?` and `hash-remove!` into the standard library.
- Changed procedure `hash-ref` to take the default value as an argument.
- Added procedure `delete-file` into the standard library.
- Allow nonlist toplevel expressions.

### Changes in the release 1.0.9

- Corrected bugs with signatures as procedure call argument types.

### Changes in the release 1.0.8

- Implemented keyword `static-cast`.
- Check the illegal use of keywords.
- Corrected the error message with an unbound variable in `set!`.
- Corrected a bug in library procedure `or-map?`.
- Added library procedures `and-map-nonpure?`, `and-map-nonpure1?`, `or-map-nonpure?`, `or-map-nonpure1?`, `a-list-delete`, `filter`, `distinct-elements?`, and `string-char-index-right`.
- Added declarations of procedures `map-car` and `map-cdr` into `core.thi`.
- Added parametrized type `:nonempty-a-list` into `core.thi`.
- Moved module `singleton` from `examples` into the standard library.

### Changes in the release 1.0.7

- Corrected a bug in the type system. Test program `test612.thp` works now.

### Changes in the release 1.0.6

- Allow toplevel statements and procedure calls in programs and module bodies.
- New keyword `prelink-body` to allow calling procedures in toplevel statements.
- Handle unspecified values with forward declarations and letrec expressions.
- Use SRFI-72 based implementation for the macro system.
- Form `identifier-syntax` and limited `syntax-case` support.
- Allow a module reference as the first argument of `set!`.

### Changes in the release 1.0.5

- Corrected equivalence predicate optimization.
- Corrected bugs in vector typecasts.
- Check illegal non-toplevel expressions.

### Changes in the release 1.0.4

- Corrected a bug with parametrized procedure result type checking.
- User defined Theme-D procedures are now visible in runtime backtrace.
- Pretty printed runtime backtraces.
- Print type information with runtime error messages.

### Changes in the release 1.0.3

- Corrected the `eq-by-value?` flag of pair classes to `#t`.
- Corrected a bug with `<none>` type.
- Optimized procedure calls.
- Optimized the equality predicates.
- Optimized checking primitive classes in `match-type` and `is-instance?`.
- Redesigned `assoc` and `member?` procedures in order to invoke the equality predicate optimization.
- Improved linker error messages with procedure typing errors.

### Changes in the release 1.0.2

- Better error messages.

### Changes in the release 1.0.1

- Simple and parametrized procedures can be used in signatures.
- Corrected a bug with type checking simple procedure calls inside parametrized procedures.

### Changes in the release 1.0.0

- Support Tree-IL as intermediate language.
- New keywords `use` and `@`: Modules can be used without importing their contents into the global namespace.
- Corrected a bug with variable argument lists.
- Corrected a bug with `param-proc-dispatch`.
- Corrected a bug with `field-set!` inside parametrized procedures.
- Procedure `apply` works with parametrized procedures.
- Corrected type deduction algorithm in case a deduced value of a type variable contains other type variables.
- Keywords `make` and `constructor` can be used with pair classes.
- Forms `and` and `or` are implemented as macros.
- Compatible with th-scheme-utilities version 1.3.

### Changes in the release 0.9.10

- Use guile objcode as the default target platform.
- Shorter target variable names.

### Changes in the release 0.9.9.1

- Implemented nonpure iterators.
- Allowed `<none>` as a type parameter.
- Changed the current value of a stream to be evaluated lazily.

### Changes in the release 0.9.9

- Corrected several bugs related to parametrized procedures.
- Corrected a bug in the runtime Theme-D environment.
- Implemented purely functional iterators.
- Added option `--verbose-errors` to the compiler and the linker.

### Changes in the release 0.9.8

- Implemented streams in the standard library.
- Improved error messages in parametrized procedure instantiation.
- Install compiled files.

### Changes in the release 0.9.7

- Corrected a bug with parametrized types (`test434` did not compile).
- Object factorization works again.
- Optimized quoted list constants.
- New keyword `static-type-of`.
- New keywords `lambda-automatic` and `param-lambda-automatic` that deduce the result type from the body expression.
- Implemented volatile variables that can be changed by pure procedures.
- Implemented object conditionals that accept any nonfalse object as true value.
- Implemented delayed evaluation (`delay` and `force`) into the standard library.
- Implemented some new procedures in module `text-file-io`.
- Reorganized the language manual and the standard library reference.

### Changes in the release 0.9.6

- Optimized `match-type`.
- Rewrote the core list handling procedures to be statically typed internally.
- Optimized parametrized primitive procedures as ordinary parametrized procedures are done.
- Corrected bugs in `psyntax-external.scm`.
- Made `detect-cycles` faster for lists.

### Changes in the release 0.9.5

- Corrected a bug with `set!`.
- Allowed `<none>` as a type parameter.
- Procedure `apply-without-result` is removed as it is no longer needed.

### Changes in the release 0.9.4

- Implemented a hygienic and lexically scoped macro system.
- Added keyword `force-pure-expr`.
- Added procedure `peek-character` into module `text-file-io`.

### Changes in the release 0.9.3

- Improved the explicit generic procedure dispatch.
- Simplified the foreign class interface.
- Corrected an error in the module system.
- Correction to mutable variable declarations.
- Corrected an error with method variable argument lists.
- Corrected a bug with `param-proc-instance`.
- Corrected the subtype checking algorithm for union types.
- A declared value can be used as a value of a constant.
- Type of a `match-type` expression may be `<object>` in some cases even though an else part is not present.
- Implemented some list and string handling procedures into the standard library.
- Better error messages for identical or noncovariant methods and erroneous parametrized procedure instantiations.

### Changes in the release 0.9.2

- Autotools are used.
- Debian packaging is supported.

### Changes in the release 0.9.1

- Implemented signatures and parametrized signatures resembling Java interfaces.

### Changes in the release 0.9.0

- Linker strips away unused code.
- Optimized application functionals `apply`, `apply-nonpure`, and `apply-without-result`.
- Implemented keyword `import-and-reeexport` for importing and reexporting modules.
- Implemented keywords `match-type` and `try-cast` for type casting.
- Implemented the symbol tables in the compiler and linker as hash tables instead of lists.
- Made the foreign function interface better. It is no longer necessary to specify equivalence predicates for external classes. Keyword `prevent-stripping` prevents stripping away a variable, which may be needed with the FFI.
- The Theme-D configuration file may be put into user's home directory instead of `/etc`.

### Changes in the release 0.8.12

- A simple foreign function interface for GOOPS classes.
- Made text file and console IO functionality better.
- Implemented `assoc` and `member?` procedures.
- Fixed several bugs.

### Changes in the release 0.8.11

- Renamed Theme to Theme-D in order to avoid confusion with Jaap Weel's Theme language.

### Changes in the release 0.8.10

- Fixed a bug with global mutable variables

### Changes in the release 0.8.9

- Custom primitive classes
- Classes may specify a zero value. This is useful for parametrized numerical classes.
- Libraries for scientific functions, complex numbers, and matrices

### Changes in the release 0.8.8

- Better type checking for parametrized types
- Factorize type expressions out of translated procedure implementations
- Implement `call-with-current-continuation`
- Procedures may be specified as always returning or never returning
- Mapping functionals in the core library implemented in Theme instead of using wrappers for Scheme functionals
- More flexible vector typecasts

###

### Changes in the release 0.8.7

- Paramerized procedures are first class objects and they are allowed as methods.
- Made an Emacs mode for Theme.

### Changes in the release 0.8.6

- Use guile 2.0 as the platform (both the translator implementation and the translator target code).
- Changed the directory structure.
- Corrected a linker bug that caused some runtime type checks not to be generated.

### Changes in the release 0.8.5

- Corrected a linker bug that caused running several tests to fail.
- Corrected a bug in the linker. Compiled program files can now be put in any directory.
- Implemented `do`-loop.
- Added documentation of `declare-method` into the language manual.

### Changes in the release 0.8.4

- A new module system. Module interfaces and implementations are now in separate files.
- Class constructors have an access specifier so you can restrict where the class may be instantiated.
- Keyword `declare-mutable` to declare mutable variables.
- The internal mutable variables of pure procedures can be changed.
- Added library procedure `apply-without-result` for procedures without result value.
- Dependencies to scsh have been removed.

### Changes in the release 0.8.3

- Changed procedure typing. Generic and parametrized types make now sense as values of procedure variables. For example, you can now compute `(map cons ′(1 2 3) ′(a b c))` and `(map + ′(1.1 2.2 3.3) ′(4.4 5.5 6.6))` .

### Changes in the release 0.8.2

- Corrected the parametrized class inheritance diagram in the specification document.
- Corrected a minor error in `theme-representation.scm`.

### Changes in the release 0.8.1

- Made `equal?` safe for cyclic data structures.
- Corrected unions so that incomplete (i.e. forward declared and not defined) types work as union member types.
- Enhanced support for compilation into Scheme48 pseudocode.
- Theme compiler and linker can now be used from a shell.
- Updated documentation and added two figures about Theme class hierarchy.
- `theme-0.8.1` requires `scheme-general-1.2`.

Copyright © 2008-2020 Tommi Höynälänmaa

Last updated: January 27, 2020

tommi.hoynalanmaa@REMOVETHISiki.fi