Design doc: JS + Tuplespace

Mike Stay

2018-10-11

This document is still very much a placeholder draft.

JS tuplespace

Use Babel to introduce new syntax
  key <identifier>; 
translates to
  let <identifier> = new Key();
where

class Key {
  constructor() {
    // use protobuf to get new internal id from CPRNG
  }
  combineWith(...keys) {
    // use protobufs to form [this.id, ...keys.map(_ => _.id)]
  }
  get r {
    // use protobuf to form bundle-{this.id}
    // How to return the proper key safely without 
    //   exposing the ability to forge names to users? 
    // Delete constructor property on new instances?
  }
  get w {
    // use protobuf to form bundle+{this.id}
  }
  get o {
    // use protobuf to form bundle0{this.id}
  }
  bang(json, nonlinear) {
    // convert JSON to RÇON
    // produce into tuplespace
  }
  fork(pattern, closure, nonlinear) {
    // closure is only provided if serialization succeeds (see below)
    // consume from tuplespace
  }
}

<keyID>!(JSON with keys) translates to key.bang(JSON, false)
<keyID>!!(JSON with keys) translates to key.bang(JSON, true)


// Fork semantics.  Primitives have built-in serialization.
// Runtime error if free var is not serializable.
// Matches go to microtask queue.
// Patterns are JSON with keys and free vars.
for(<pattern> <- <key>) fork {
  <statements>
}
translates to key.fork(pattern, closure, false)

for(<pattern> <= <key>) fork {
  <statements>
}
translates to key.fork(pattern, closure, true)

Closure is an AST for the statements and an environment map from free vars to their serialized values.
Translated pattern is an AST?