# Second Racket implementation of Syndicate ## The language itself This repository contains a [Racket](http://racket-lang.org/) implementation of Syndicate, which includes - the implementation of the `#lang syndicate` language, in the [`syndicate` directory](syndicate/). - a TCP echo server example, which listens for connections on port 5999 by default, in [`syndicate-examples/echo.rkt`](syndicate-examples/echo.rkt). Connect to it using, for example, `telnet localhost 5999`. - a number of other examples both small and large, in [`syndicate-examples/`](syndicate-examples/). ## New implementation This is a reimplementation of Syndicate that takes the language-level constructs of facets, endpoints, and fields to heart, integrating knowledge of facets and endpoints into the dataspace implementation itself. It gains a *significant* performance advantage by doing so. Programs seem to be about *20x faster* (compared to the [previous implementation](https://github.com/tonyg/syndicate/tree/master/racket)). Some are only 10x faster, some are 30x faster. The implementation techniques herein are the subject of a forthcoming paper. The prototype that embodies the new idea is in [historical/prototype.rkt](historical/prototype.rkt), and [syndicate/HOWITWORKS.md](syndicate/HOWITWORKS.md) describes the approach via prose. All the drivers end up looking much nicer with this new implementation. The previously-separate GL-2D support is now integrated as just another driver (though the timing characteristics of the old implementation are not precisely preserved). The [ground.rkt](syndicate/ground.rkt) implementation is much cleaner. To see the difference in speed, try out the "many Racket logos" animation example/demo after installing the `syndicate` and `syndicate-examples` packages: racket -l syndicate-examples/gl-2d-many Hopefully you'll get a smooth 60fps, though I admit I'm running it on a fairly fast machine so you might need to drop the `sprite-count` in the code a bit to sustain 60fps. ## Compiling and running the code You will need Racket version 7.6 or later. Once you have Racket installed, run raco pkg install syndicate to install the package from the Racket package repository, or raco pkg install --link syndicate from the root directory of the Git checkout to install the package from a local snapshot. This will make `#lang syndicate` available to programs. Repeat the process with `syndicate-examples` in place of `syndicate` to install the examples as well. Alternatively, `make link` from the root directory of the Git checkout installs both packages from the local copy. ### Running the tests The implementation test suite lives in [syndicate/test/](syndicate/test/). Run it with: raco setup syndicate; raco test -p syndicate ## Copyright Copyright © Tony Garnock-Jones 2010-2020.