2016-03-09 11:23:06 +00:00
|
|
|
|
---
|
2016-03-30 22:32:07 +00:00
|
|
|
|
title: Home
|
2016-03-09 11:23:06 +00:00
|
|
|
|
layout: page
|
2016-04-01 18:33:58 +00:00
|
|
|
|
class: frontpage
|
|
|
|
|
link:
|
|
|
|
|
ghrepo: 'https://github.com/tonyg/syndicate'
|
2016-04-04 03:13:40 +00:00
|
|
|
|
docs: 'http://docs.racket-lang.org/syndicate/index.html'
|
2016-03-09 11:23:06 +00:00
|
|
|
|
---
|
|
|
|
|
|
2016-04-01 19:17:27 +00:00
|
|
|
|
**noun**
|
|
|
|
|
/ˈsindikit/
|
|
|
|
|
|
|
|
|
|
1. a self-organizing group of individuals, companies, corporations or
|
|
|
|
|
entities formed to transact some specific business, to pursue or
|
2016-04-04 03:13:40 +00:00
|
|
|
|
promote a shared interest.
|
|
|
|
|
<small>—[Wikipedia](https://en.wikipedia.org/wiki/Syndicate)</small>
|
2016-04-01 19:17:27 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<div></div>
|
2016-03-30 22:32:07 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- # Motivation -->
|
2016-03-30 22:32:07 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- Every interactive program needs some way of -->
|
2016-03-30 22:32:07 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- - representing the *conversations* it is having as *concurrent -->
|
|
|
|
|
<!-- components* -->
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- - *mapping incoming events* to these components -->
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- - managing the *shared understanding* that the components are -->
|
|
|
|
|
<!-- building as they work towards the program's goal -->
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- - cleaning up shared state after *partial failure* of a component -->
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- - *scoping* interactions and shared state inside the program -->
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- Existing programming languages lack linguistic support for these -->
|
|
|
|
|
<!-- requirements, leaving the programmer to fend for themselves. -->
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- Syndicate is a language designed to help organise interactive -->
|
|
|
|
|
<!-- programs. -->
|
|
|
|
|
|
|
|
|
|
## Overview
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-02 01:03:03 +00:00
|
|
|
|
Syndicate is an Actor-based language offering
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-02 01:03:03 +00:00
|
|
|
|
- pub/sub pattern-based message routing, for mapping events to actors
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-02 01:03:03 +00:00
|
|
|
|
- *dataspaces*, stores for semi-structured data, for managing shared
|
|
|
|
|
state
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-02 01:03:03 +00:00
|
|
|
|
- *state change notifications* for keeping actors informed of changes
|
|
|
|
|
in dataspaces
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-02 01:03:03 +00:00
|
|
|
|
- integrated techniques for registering and discovering services and
|
|
|
|
|
for cleaning up after both graceful and unexpected actor failures
|
2016-04-01 18:33:58 +00:00
|
|
|
|
|
2016-04-02 01:03:03 +00:00
|
|
|
|
- recursive layering of groups of actors, each group with a private
|
|
|
|
|
dataspace of its own, for organising larger programs
|
2016-03-09 11:23:06 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<!-- Together, these features help address the above challenges. -->
|
|
|
|
|
|
|
|
|
|
Together, these features help programmers organise their interactive programs.
|
|
|
|
|
|
|
|
|
|
## Example
|
|
|
|
|
|
|
|
|
|
These two actors implement a toy “bank account” actor that listens for
|
|
|
|
|
`deposit` messages and maintains an `account` balance record in the
|
|
|
|
|
shared dataspace. The first is written using Syndicate implemented for
|
|
|
|
|
Racket, and the second using Syndicate for JavaScript.
|
|
|
|
|
|
|
|
|
|
{% capture racket_example1 %}{% include frontpage_racket_example1.md %}{% endcapture %}
|
|
|
|
|
{% capture javascript_example1 %}{% include frontpage_javascript_example1.md %}{% endcapture %}
|
|
|
|
|
{% capture racket_example2 %}{% include frontpage_racket_example2.md %}{% endcapture %}
|
|
|
|
|
{% capture javascript_example2 %}{% include frontpage_javascript_example2.md %}{% endcapture %}
|
|
|
|
|
|
|
|
|
|
<div class="frontpage_code_examples">
|
|
|
|
|
{{ racket_example1 | markdownify }}
|
|
|
|
|
{{ javascript_example1 | markdownify }}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
The next two implement a client for the “bank account”. Each time the
|
|
|
|
|
balance in the shared dataspace changes, they print a message to the
|
|
|
|
|
console.
|
2016-04-02 01:03:03 +00:00
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
<div class="frontpage_code_examples">
|
|
|
|
|
{{ racket_example2 | markdownify }}
|
|
|
|
|
{{ javascript_example2 | markdownify }}
|
|
|
|
|
</div>
|
|
|
|
|
|
2016-04-04 03:21:14 +00:00
|
|
|
|
The full code for the Racket example is
|
|
|
|
|
[bank-account.rkt](https://github.com/tonyg/syndicate/blob/master/racket/syndicate/examples/actor/bank-account.rkt),
|
|
|
|
|
and for the JavaScript example,
|
|
|
|
|
[demo-bankaccount.js](https://github.com/tonyg/syndicate/blob/master/js/compiler/demo-bankaccount.js).
|
|
|
|
|
|
2016-04-06 16:42:05 +00:00
|
|
|
|
## Live Syndicate/js demos
|
|
|
|
|
|
|
|
|
|
[This page](examples/) links to in-browser runnable demos (and source
|
|
|
|
|
code) of Syndicate/js programs.
|
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
## Code
|
2016-04-02 01:03:03 +00:00
|
|
|
|
|
|
|
|
|
Syndicate is implemented both for [Racket](http://racket-lang.org/)
|
2016-04-04 03:13:40 +00:00
|
|
|
|
and for [JavaScript](https://en.wikipedia.org/wiki/ECMAScript).
|
2016-04-02 01:03:03 +00:00
|
|
|
|
|
|
|
|
|
<a href="{{ page.link.ghrepo }}"><img class="leftfloat" alt="Link to Syndicate github repo" src="{{ site.baseurl }}/img/GitHub-Mark-64px.png"></a>
|
|
|
|
|
The [Syndicate github repository]({{ page.link.ghrepo }}) contains
|
|
|
|
|
implementations along with some larger example programs.
|
|
|
|
|
|
|
|
|
|
<div class="clear"></div>
|
|
|
|
|
|
2016-04-04 03:13:40 +00:00
|
|
|
|
## Documentation
|
|
|
|
|
|
2016-04-07 07:46:20 +00:00
|
|
|
|
The system is still somewhat in flux, and documentation is still being
|
|
|
|
|
written. A draft of the documentation for the Racket implementation of
|
|
|
|
|
Syndicate is available [here]({{ page.link.docs }}).
|
2016-04-04 03:13:40 +00:00
|
|
|
|
|
|
|
|
|
## Papers
|
2016-04-02 01:03:03 +00:00
|
|
|
|
|
|
|
|
|
<a href="{{ site.baseurl }}/papers/from-events-to-reactions-a-progress-report-20160301-1747.pdf"><img class="leftfloat" src="{{ site.baseurl }}/img/pdf_icon_gen_48x49.png"></a>
|
|
|
|
|
Tony Garnock-Jones, [“From Events To Reactions: A Progress Report”]({{
|
|
|
|
|
site.baseurl
|
|
|
|
|
}}/papers/from-events-to-reactions-a-progress-report-20160301-1747.pdf),
|
2016-04-12 20:36:13 +00:00
|
|
|
|
In: Proc. PLACES 2016 (workshop), April 2016, Eindhoven, Netherlands. ([PDF]({{ site.baseurl }}/papers/from-events-to-reactions-a-progress-report-20160301-1747.pdf); [Slides]({{ site.baseurl }}/papers/places-2016-slides.pdf))
|
2016-04-02 01:03:03 +00:00
|
|
|
|
|
|
|
|
|
<div class="clear"></div>
|
|
|
|
|
|
|
|
|
|
<a href="{{ site.baseurl }}/papers/coordinated-concurrent-programming-in-syndicate-20160111-1409.pdf"><img class="leftfloat" src="{{ site.baseurl }}/img/pdf_icon_gen_48x49.png"></a>
|
|
|
|
|
Tony Garnock-Jones and Matthias Felleisen,
|
|
|
|
|
[“Coordinated Concurrent Programming in Syndicate”]({{ site.baseurl
|
|
|
|
|
}}/papers/coordinated-concurrent-programming-in-syndicate-20160111-1409.pdf),
|
2016-04-12 20:36:13 +00:00
|
|
|
|
In: Proc. ESOP 2016, April 2016, Eindhoven, Netherlands. ([PDF]({{ site.baseurl }}/papers/coordinated-concurrent-programming-in-syndicate-20160111-1409.pdf); [Slides]({{ site.baseurl }}/papers/esop-2016-slides.pdf))
|
2016-04-04 03:13:40 +00:00
|
|
|
|
|
|
|
|
|
<div class="clear"></div>
|
|
|
|
|
|
|
|
|
|
<a href="{{ site.baseurl }}/papers/network-as-language-construct-20140117-1204.pdf"><img class="leftfloat" src="{{ site.baseurl }}/img/pdf_icon_gen_48x49.png"></a>
|
|
|
|
|
Tony Garnock-Jones, Sam Tobin-Hochstadt, and Matthias Felleisen,
|
|
|
|
|
[“The Network as a Language Construct”]({{ site.baseurl
|
|
|
|
|
}}/papers/network-as-language-construct-20140117-1204.pdf),
|
2016-04-12 20:36:13 +00:00
|
|
|
|
In: Proc. ESOP 2014, April 2016, Eindhoven, Netherlands. ([PDF]({{ site.baseurl }}/papers/network-as-language-construct-20140117-1204.pdf); [Slides]({{ site.baseurl }}/papers/esop-2014-slides.pdf))
|
2016-04-02 01:03:03 +00:00
|
|
|
|
|
|
|
|
|
<div class="clear"></div>
|
2016-04-05 07:41:43 +00:00
|
|
|
|
|
|
|
|
|
## Contact
|
|
|
|
|
|
|
|
|
|
Please feel free to email me at <a href="mailto:tonyg@ccs.neu.edu">tonyg@ccs.neu.edu</a>.
|