An implementation of the Shen Language by Mark Tarver for JavaScript. Full documentation can be viewed at shenscript.readthedocs.io.
- Allows integration with arbitrary I/O.
- Async operations are transparent to written Shen code.
- Easy interop: JS can be called from Shen, Shen can be called from JS.
- Fairly small production webpack bundle (~370KB uncompressed, ~60KB gzip compressed).
- Decent web startup time (~50ms in Chromium, ~100ms in Firefox).
Requires recent version (10+) of Node.js and npm.
Works in most modern browers (Chromium, Firefox, Safari and Edge).
First, run npm install
as you would with any other Node project. Then run the following scripts build and test the project. Steps need to be run in order - steps after fetch-kernel
won't work if the kernel hasn't been fetched.
Script | Description |
---|---|
test-backend |
Runs mocha tests for the basic environment and compiler. |
fetch-kernel |
Downloads the kernel sources from shen-sources to kernel/ . |
render-kernel |
Translates the kernel sources to JavaScript and stores under kernel/js/ . |
test-kernel |
Runs the test suite that comes with the Shen kernel. |
test-frontend |
Runs mocha tests for helper and interop functions. |
bundle-dev |
Applies babel transforms and webpack's into web-deployable bundle. |
bundle |
Builds bundle in production mode. |
bundle-min |
Builds minified production bundle. |
bundles |
Generates all bundles. |
lint |
If you make changes, run lint to check adherence to style and code quality. |
Run npm start
to start webpack watch or npm run bundle-dev
to do a one-time build.
If you open index.html
in your browser a basic webpage will load, and when ready, it will display the load time. (The production webpack bundle does not automatically create a Shen environment and does not log anything.) index.html
should be viewable without hosting in a web server, but you will not be able to use the load
function to load additional Shen code if opened from a relative file://
path. http-server
is adequate for hosting in a web server.
If you open the JavaScript console in the developer tools, it is possible to access to the $
global object and execute commands:
$.exec("(+ 1 1)").then(console.log);
Chaining the then
call is necessary because exec
will return a Promise
. For more information refer to the documentation.
Run npm run repl
to run a command-line REPL. It should have the same behavior as the shen-cl
REPL. node.
functions will be available. Run (node.exit)
to exit the REPL.
Neither command-line options nor the launcher
kernel extension are implemented. ShenScript is not intended to take the form of a standalone executable.