syndicate-2017/README.md

67 lines
2.7 KiB
Markdown
Raw Normal View History

2016-04-01 23:53:46 +00:00
# Syndicate: A Networked, Concurrent, Functional Programming Language
2015-08-18 16:47:29 +00:00
2016-04-01 23:53:46 +00:00
Syndicate is an actor-based concurrent language able to express
2015-08-18 16:47:29 +00:00
communication, enforce isolation, and manage resources.
Network-inspired extensions to a functional core represent imperative
actions as values, giving side-effects locality and enabling
composition of communicating processes.
2016-01-18 19:29:48 +00:00
Collaborating actors are grouped within task-specific *networks* (a.k.a.
2015-08-18 16:47:29 +00:00
virtual machines) to scope their interactions. Conversations between
actors are multi-party (using a publish/subscribe medium), and actors
can easily participate in many such conversations at once.
2016-04-01 23:53:46 +00:00
Syndicate makes *presence* notifications an integral part of pub/sub
2015-08-18 16:47:29 +00:00
through its *shared dataspaces*, akin to
[tuplespaces](https://en.wikipedia.org/wiki/Tuple_space). Each shared
2016-01-18 19:29:48 +00:00
dataspace doubles as the pub/sub subscription table for its network.
2015-08-18 16:47:29 +00:00
Actors react to *state change notifications* reporting changes in a
dataspace, including new subscriptions created by peers and removal of
subscriptions when a peer exits or crashes. State change notifications
serve to communicate changes in demand for and supply of services,
2016-01-18 19:29:48 +00:00
both within a single network and across nested layers of
networks-within-networks. Programs can give up responsibility for
2015-08-18 16:47:29 +00:00
maintaining shared state and for scoping group communications, letting
2016-01-18 19:29:48 +00:00
their containing network take on those burdens.
2015-08-18 16:47:29 +00:00
## The code
This repository contains a [Racket](http://racket-lang.org/) package,
2016-04-01 23:53:46 +00:00
`syndicate`, which includes
2015-08-18 16:47:29 +00:00
2016-04-01 23:53:46 +00:00
- the implementation of the `#lang syndicate` language, in the
[`syndicate` directory](https://github.com/tonyg/syndicate/tree/master/syndicate/).
2015-08-18 16:47:29 +00:00
- a TCP echo server example, which listens for connections on port
5999 by default, in
2016-04-01 23:53:46 +00:00
[`syndicate/examples/echo.rkt`](https://github.com/tonyg/syndicate/tree/master/syndicate/examples/echo.rkt).
2015-08-18 16:47:29 +00:00
Connect to it using, for example, `telnet localhost 5999`.
- a handful of other examples, in
2016-04-01 23:53:46 +00:00
[`syndicate/examples/`](https://github.com/tonyg/syndicate/tree/master/syndicate/examples/).
2015-08-18 16:47:29 +00:00
## Compiling and running the code
You will need Racket version 6.3 or later.
2015-08-18 16:47:29 +00:00
Once you have Racket installed, run
2016-04-01 23:53:46 +00:00
raco pkg install syndicate
2015-08-18 16:47:29 +00:00
to install the package from the Racket package repository, or
2015-10-21 13:26:43 +00:00
raco pkg install
2015-08-18 16:47:29 +00:00
from the root directory of the Git checkout to install the package
from a local snapshot. (Alternatively, `make link` does the same thing.)
2016-04-01 23:53:46 +00:00
This will make `#lang syndicate` available to programs.
2015-08-18 16:47:29 +00:00
At this point, you may load and run any of the example `*.rkt` files
in the
2016-04-01 23:53:46 +00:00
[`syndicate/examples/`](https://github.com/tonyg/syndicate/tree/master/syndicate/examples/)
2015-08-18 16:47:29 +00:00
directory.
## Copyright
2016-01-30 16:39:05 +00:00
Copyright © Tony Garnock-Jones 2010, 2011, 2012, 2013, 2014, 2015, 2016.