diff --git a/TODO.md b/TODO.md index 86ea88b..9230efe 100644 --- a/TODO.md +++ b/TODO.md @@ -10,6 +10,8 @@ - [DONE] dataspaces, dataspace relays - [DONE? Surely there's more] pin down and fix the problems with facet field scope (!!) - [DONE] `npm init @syndicate` + - [DONE] change send syntax from `^ ...` to `send ...` :-( + - Using `^` is too cute. Indentation doesn't work, and forgetting a semicolon causes silent xor! - [DONE] timer driver - [DONE] ui driver @@ -30,5 +32,3 @@ some formulations of the game-restart logic in the flappy bird demo. - - change send syntax from `^ ...` to `send ...` :-( - - it's too cute. Indentation doesn't work, and forgetting a semicolon causes silent xor! diff --git a/packages/broker/src/index.js b/packages/broker/src/index.js index ae269fd..d75f603 100644 --- a/packages/broker/src/index.js +++ b/packages/broker/src/index.js @@ -35,7 +35,7 @@ spawn named 'websocketListener' { during Http.WebSocket($reqId, server, ['broker'], _) spawn named ['wsConnection', reqId] { on message Http.DataIn(reqId, $message) { console.log('got', reqId, new Decoder(message).next()); - ^ Http.DataOut(reqId, message); + send Http.DataOut(reqId, message); } stop on message Http.DataIn(reqId, Bytes.from("quit")); @@ -47,7 +47,7 @@ spawn named 'tcpListener' { assert Tcp.TcpAccepted(id); on message Tcp.DataIn(id, $data) { console.log('got', id, data); - ^ Tcp.DataOut(id, data); + send Tcp.DataOut(id, data); } } } diff --git a/packages/driver-browser-ui/src/index.js b/packages/driver-browser-ui/src/index.js index 6ee4297..490b4cb 100644 --- a/packages/driver-browser-ui/src/index.js +++ b/packages/driver-browser-ui/src/index.js @@ -40,7 +40,7 @@ export function newFragmentId() { spawn named 'GlobalEventFactory' { during Observe(P.GlobalEvent($selector, $eventType, _)) spawn named ['GlobalEvent', selector, eventType] { - let sender = Dataspace.wrapExternal((e) => { ^ P.GlobalEvent(selector, eventType, e); }); + let sender = Dataspace.wrapExternal((e) => { send P.GlobalEvent(selector, eventType, e); }); function handler(event) { sender(event); return dealWithPreventDefault(eventType, event); @@ -66,7 +66,7 @@ spawn named 'GlobalEventFactory' { spawn named 'WindowEventFactory' { during Observe(P.WindowEvent($eventType, _)) spawn named ['WindowEvent', eventType] { - let sender = Dataspace.wrapExternal((e) => { ^ P.WindowEvent(eventType, e); }); + let sender = Dataspace.wrapExternal((e) => { send P.WindowEvent(eventType, e); }); let handler = function (event) { sender(event); return dealWithPreventDefault(eventType, event); @@ -147,7 +147,7 @@ spawn named 'UIFragmentFactory' { if (!(key in eventRegistrations)) { let sender = Dataspace.wrapExternal((e) => { - ^ P.UIEvent(fragmentId, c.selector, c.eventType, e); + send P.UIEvent(fragmentId, c.selector, c.eventType, e); }); function handler(event) { sender(event); diff --git a/packages/driver-http-node/src/index.js b/packages/driver-http-node/src/index.js index 90916a8..0e191b0 100644 --- a/packages/driver-http-node/src/index.js +++ b/packages/driver-http-node/src/index.js @@ -218,7 +218,7 @@ function _server(host, port, httpsOptions) { on asserted Observe(DataIn(id, _)) { ws.on('message', Dataspace.wrapExternal((message) => { - ^ DataIn(id, Bytes.fromIO(message)); + send DataIn(id, Bytes.fromIO(message)); })); } diff --git a/packages/driver-tcp-node/src/index.js b/packages/driver-tcp-node/src/index.js index 03e2227..9878cb4 100644 --- a/packages/driver-tcp-node/src/index.js +++ b/packages/driver-tcp-node/src/index.js @@ -78,7 +78,7 @@ spawn named 'driver/TcpDriver' { if (pos !== -1) { const line = this.buffer.slice(0, pos); this.buffer = this.buffer.slice(pos + 1); - ^ LineIn(id, line); + send LineIn(id, line); } } } @@ -107,9 +107,7 @@ function _connectionCommon(rootFacet, id, socket, established) { on stop try { socket.destroy() } catch (e) { console.error(e); } on start react stop on asserted Observe(DataIn(id, _)) { - socket.on('data', Dataspace.wrapExternal((data) => { - ^ DataIn(id, Bytes.fromIO(data)); - })); + socket.on('data', Dataspace.wrapExternal((data) => { send DataIn(id, Bytes.fromIO(data)); })); } on message DataOut(id, $data) { diff --git a/packages/driver-timer/src/index.js b/packages/driver-timer/src/index.js index 50f53be..a23c10e 100644 --- a/packages/driver-timer/src/index.js +++ b/packages/driver-timer/src/index.js @@ -36,9 +36,8 @@ spawn named 'driver-timer/PeriodicTick' { let handle = null; let finish = Dataspace.backgroundTask(); on start { - handle = setInterval(Dataspace.wrapExternal(() => { - ^ PeriodicTick(intervalMS); - }), Float.unwrap(intervalMS)); + handle = setInterval(Dataspace.wrapExternal(() => { send PeriodicTick(intervalMS); }), + Float.unwrap(intervalMS)); } on stop { if (handle) { diff --git a/packages/driver-udp-node/src/index.js b/packages/driver-udp-node/src/index.js index 9f58cd6..20b5433 100644 --- a/packages/driver-udp-node/src/index.js +++ b/packages/driver-udp-node/src/index.js @@ -70,7 +70,7 @@ function _socket(addr, port) { socket.on('listening', Dataspace.wrapExternal(() => { this.connected = true; })); socket.on('message', Dataspace.wrapExternal((message, rinfo) => { - ^ UdpPacket(UdpPeer(rinfo.address, rinfo.port), addr, Bytes.fromIO(message)); + send UdpPacket(UdpPeer(rinfo.address, rinfo.port), addr, Bytes.fromIO(message)); })); }; diff --git a/packages/driver-websocket/src/index.js b/packages/driver-websocket/src/index.js index 4136226..1cd117c 100644 --- a/packages/driver-websocket/src/index.js +++ b/packages/driver-websocket/src/index.js @@ -52,7 +52,7 @@ spawn named 'WebSocketFactory' { ws.onopen = Dataspace.wrapExternal(() => { this.connected = true; }); ws.onclose = Dataspace.wrapExternal(() => { if (this.connected) { connect(); }}); - ws.onmessage = Dataspace.wrapExternal((data) => { ^ DataIn(id, Bytes.fromIO(data.data)); }); + ws.onmessage = Dataspace.wrapExternal((data) => { send DataIn(id, Bytes.fromIO(data.data)) }); }; const disconnect = () => { diff --git a/packages/flappy-bird-demo/src/index.js b/packages/flappy-bird-demo/src/index.js index 2c15fd8..74d3981 100644 --- a/packages/flappy-bird-demo/src/index.js +++ b/packages/flappy-bird-demo/src/index.js @@ -45,9 +45,7 @@ spawn named 'game-factory' { during GameOver() { on stop spawnGame(); on message UI.WindowEvent('+keypress', $e) { - if (e.key !== ' ') { - ^ Reset(); - } + if (e.key !== ' ') send Reset(); } } } @@ -56,9 +54,7 @@ function spawnGame() { spawn dataspace named 'GameInstance' { spawn named 'game-instance-control' { during GameOver() assert Outbound(GameOver()); - on message Inbound(Reset()) { - ^ $QuitDataspace; - } + on message Inbound(Reset()) send $QuitDataspace; } spawn named 'score' { @@ -143,9 +139,7 @@ function spawnGame() { stop on (this.xpos < -(PILLAR_WIDTH + FLAPPY_XPOS)); - on start react stop on (this.xpos <= 0) { - ^ IncreaseScore(); - } + on start react stop on (this.xpos <= 0) send IncreaseScore(); field this.xpos = xlocation; on asserted Position($xpos, _) this.xpos = xlocation - xpos.value; diff --git a/packages/syntax-playground/src/assertionspeed.js b/packages/syntax-playground/src/assertionspeed.js index 6c3e770..ad3615a 100644 --- a/packages/syntax-playground/src/assertionspeed.js +++ b/packages/syntax-playground/src/assertionspeed.js @@ -35,7 +35,7 @@ spawn named 'box' { spawn named 'client' { on asserted Protocol.BoxState($v) { // console.log('client sending SetBox', v + 1); - ^ Protocol.SetBox(v + 1); + send Protocol.SetBox(v + 1); } on retracted Protocol.BoxState(_) { diff --git a/packages/syntax-playground/src/chatclient.js b/packages/syntax-playground/src/chatclient.js index f970d7a..b132e5c 100644 --- a/packages/syntax-playground/src/chatclient.js +++ b/packages/syntax-playground/src/chatclient.js @@ -33,7 +33,7 @@ spawn named 'chatclient' { .on('error', Dataspace.wrapExternal((err) => { throw err; })) .on('close', Dataspace.wrapExternal(() => { rootFacet.stop(); })) .on('data', Dataspace.wrapExternal( - (data) => { if (data) { ^ Tcp.DataOut(id, data + '\n'); }})); + (data) => { if (data) send Tcp.DataOut(id, data + '\n'); })); on stop process.stdin.destroy(); on message Tcp.LineIn(id, $line) { console.log(line.toString('utf-8')); } diff --git a/packages/syntax-playground/src/chatserver.js b/packages/syntax-playground/src/chatserver.js index 7c51673..27b7a02 100644 --- a/packages/syntax-playground/src/chatserver.js +++ b/packages/syntax-playground/src/chatserver.js @@ -29,11 +29,11 @@ spawn named 'chatserver' { assert Present(me); during Present($who) { - on start { ^ Tcp.DataOut(id, `${who} arrived.\n`); } - on stop { ^ Tcp.DataOut(id, `${who} departed.\n`); } + on start send Tcp.DataOut(id, `${who} arrived.\n`); + on stop send Tcp.DataOut(id, `${who} departed.\n`); } - on message Tcp.LineIn(id, $line) { ^ Speak(me, line); } - on message Speak($who, $what) { ^ Tcp.DataOut(id, `${who}: ${what}\n`); } + on message Tcp.LineIn(id, $line) send Speak(me, line); + on message Speak($who, $what) send Tcp.DataOut(id, `${who}: ${what}\n`); } } diff --git a/packages/syntax-playground/src/client.js b/packages/syntax-playground/src/client.js index a15bd77..ecaf853 100644 --- a/packages/syntax-playground/src/client.js +++ b/packages/syntax-playground/src/client.js @@ -34,7 +34,7 @@ spawn named 'demo' { } on message PeriodicTick(1000) { - ^ WS.DataOut(wsId, Bytes.from(genUuid('timestamp'))); + send WS.DataOut(wsId, Bytes.from(genUuid('timestamp'))); } } } diff --git a/packages/syntax-playground/src/index.js b/packages/syntax-playground/src/index.js index 69d3a42..f36dbe0 100644 --- a/packages/syntax-playground/src/index.js +++ b/packages/syntax-playground/src/index.js @@ -56,7 +56,7 @@ spawn named 'view' { spawn named 'controller' { on message UI.GlobalEvent('table#the-table th', 'click', $e) { - ^ SetSortColumn(JSON.parse(e.target.dataset.column)); + send SetSortColumn(JSON.parse(e.target.dataset.column)); } } diff --git a/packages/syntax-playground/src/mc.js b/packages/syntax-playground/src/mc.js index 96e13b5..192ca4d 100644 --- a/packages/syntax-playground/src/mc.js +++ b/packages/syntax-playground/src/mc.js @@ -39,7 +39,7 @@ spawn named 'multicast_demo' { } on message PeriodicTick(2000) { - ^ U.UdpPacket(HANDLE, U.UdpPeer(GROUP_ADDRESS, PORT), genUuid('timestamp')); + send U.UdpPacket(HANDLE, U.UdpPeer(GROUP_ADDRESS, PORT), genUuid('timestamp')); } } } diff --git a/packages/syntax-playground/src/messagespeed.js b/packages/syntax-playground/src/messagespeed.js index b526e23..f87d321 100644 --- a/packages/syntax-playground/src/messagespeed.js +++ b/packages/syntax-playground/src/messagespeed.js @@ -22,14 +22,13 @@ var Dataspace = require('@syndicate-lang/core').Dataspace; const N = 100000; spawn { - on start { - ^ 0; - } + on start send 0; + on message $v { if (v === N) { Dataspace.currentFacet().stop(); } else { - ^ v + 1; + send v + 1; } } } diff --git a/packages/syntax-playground/src/nested2.js b/packages/syntax-playground/src/nested2.js index 747d1b3..f04d23f 100644 --- a/packages/syntax-playground/src/nested2.js +++ b/packages/syntax-playground/src/nested2.js @@ -40,7 +40,7 @@ spawn dataspace named 'C' { spawn named 'H' on asserted Inbound(Inbound(Greeting($t))) console.log('Inner dataspace:', t); spawn named 'I' on asserted Inbound(Inbound(Greeting('Inner!'))) { console.log('I: Terminating F'); - ^ $QuitDataspace + send $QuitDataspace; }; } diff --git a/packages/syntax-playground/src/server.js b/packages/syntax-playground/src/server.js index 51551d7..92c53d0 100644 --- a/packages/syntax-playground/src/server.js +++ b/packages/syntax-playground/src/server.js @@ -126,7 +126,7 @@ spawn named 'websocketEchoServer' { during Http.WebSocket($reqId, server, ['echo'], _) { on message Http.DataIn(reqId, $message) { console.log('got', reqId, message); - ^ Http.DataOut(reqId, message); + send Http.DataOut(reqId, message); } stop on message Http.DataIn(reqId, "quit"); diff --git a/packages/syntax/src/generators.js b/packages/syntax/src/generators.js index d48f48f..e9a9742 100644 --- a/packages/syntax/src/generators.js +++ b/packages/syntax/src/generators.js @@ -139,7 +139,7 @@ export function SyndicateTypeDefinition(node) { } export function MessageSendStatement(node) { - this.token("^"); + this.token("send"); this.space(); this.print(node.body, node); this.semicolon(); diff --git a/packages/syntax/src/parser.js b/packages/syntax/src/parser.js index 2aa43f4..1bd7c06 100644 --- a/packages/syntax/src/parser.js +++ b/packages/syntax/src/parser.js @@ -54,21 +54,6 @@ export default class SyndicateParser extends _original_Parser { let previousError = null; switch (this.state.type) { - case tt.bitwiseXOR: - if (this.hasPlugin("syndicate")) { - let result = this.withBacktracking( - () => { - this.next(); - const node = this.startNode(); - node.body = this.parseExpression(); - this.semicolon(); - return this.finishNode(node, "MessageSendStatement"); - }, - (err) => { previousError = err; return null; }); - if (result) return result; - } - break; - case tt.name: if (this.hasPlugin("syndicate")) { let result = this.withBacktracking( @@ -141,6 +126,14 @@ export default class SyndicateParser extends _original_Parser { return this.finishNode(node, "SyndicateReactStatement"); } + if (this.isContextual("send")) { + this.next(); + const node = this.startNode(); + node.body = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "MessageSendStatement"); + } + if (this.isContextual("assertion") || this.isContextual("message")) { const node = this.startNode(); node.expectedUse = this.state.value;