|
1 year ago | |
---|---|---|
packages | @syndicate-lang/syndicatec@0.1.0 | 1 year ago |
todo | Move docker to todo | 1 year ago |
.gitignore | Lerna wants us to not ignore package-lock.json | 1 year ago |
.npmignore | Switch to apenwarr's `redo` | 4 years ago |
LICENCE | README | 4 years ago |
Makefile | Split up compiler into more packages | 1 year ago |
Makefile.generic-package | Fix all target | 1 year ago |
README.md | WIP lax parser, matcher, rewriter and compiler | 1 year ago |
TODO.md | Subprocess support | 4 years ago |
gpl-3.0.txt | README | 4 years ago |
lerna.json | Initial monorepo commit | 4 years ago |
package.json | Initial port to typescript/es6/babel-free. Far from working or complete | 1 year ago |
veryclean.do | Don't automatically remove package-lock.json | 2 years ago |
watchall | watchall | 1 year ago |
README.md
Syndicate/js
A new, efficient implementation of Syndicate for JavaScript in both node.js and the browser. The implementation techniques herein are the subject of a forthcoming paper.
Quickstart
Option 1. Create a new program/library using Syndicate/js.
Use npx @syndicate-lang/create DIRECTORY
or npm init @syndicate-lang DIRECTORY
:
npm init @syndicate-lang myprogram
cd myprogram
npm i .
npm run build
node lib/index.js
Option 2. Add Syndicate/js to an existing program/library.
Install a few packages from the @syndicate-lang scope on npmjs.com:
npm i --save-dev @syndicate-lang/syntax @babel/preset-env
npm i --save @syndicate-lang/core
Then, add the @syndicate-lang/syntax/plugin
to your .babelrc
. Use
npx syndicate-babel
in place of npx babel
to compile your code.
Creating a new Syndicate/js project
Create a skeletal package.json
:
{
"main": "lib/index.js",
"scripts": {
"build": "npx syndicate-babel src --out-dir lib",
"clean": "rm -rf lib"
}
}
The entry point will be lib/index.js
; the corresponding source
file will be src/index.js
.
Two npm run
scripts are defined: one which compiles Syndicate/js
source files in src
to plain JavaScript in lib
. The compiler uses
Babel; we will configure Babel next.
Create a .babelrc
file:
{
"presets": [ "@babel/preset-env" ],
"plugins": [ "@syndicate-lang/syntax/plugin" ]
}
Now, install the necessary dependencies. Babel and the Syndicate/js extensions are needed at build-time:
npm i --save-dev @syndicate-lang/syntax @babel/preset-env
The Syndicate/js runtime and as many drivers as you would like to use are needed at run-time:
npm i --save @syndicate-lang/core
npm i --save @syndicate-lang/driver-timer
Finally, create the main program file. Create a directory src
, and
then a file src/index.js
:
const { TimeLaterThan } = activate require("@syndicate-lang/driver-timer");
spawn named 'ticker' {
field this.counter = 0;
field this.deadline = +(new Date());
on start { console.log('ticker starting'); }
on stop { console.log('ticker stopping'); }
on asserted TimeLaterThan(this.deadline) {
this.counter++;
console.log('tick', new Date(), this.counter);
this.deadline += 1000;
}
stop on (this.counter == 5);
}
Now, compile the project:
npm run build
Finally, run the program:
node lib/index.js
The output should be something like:
ticker starting
tick 2018-11-05T14:23:27.713Z 1
tick 2018-11-05T14:23:28.705Z 2
tick 2018-11-05T14:23:29.706Z 3
tick 2018-11-05T14:23:30.706Z 4
tick 2018-11-05T14:23:31.707Z 5
ticker stopping
Licence
@syndicate-lang, an implementation of Syndicate for JS.
Copyright (C) 2016-2021 Tony Garnock-Jones tonyg@leastfixedpoint.com
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.